1.時間自然語言分析工具類(NLP) TimeNLPUtil。
包括功能:
(1)以當前時間為基礎分析時間自然語言。
(2)以指定時間為基礎分析時間自然語言。
2.中國工作日計算(將放假信息包含在內),包括判斷當前日期是否為工作日和下一個工作日等方法,需要傳節假日數據參數holidayData。
3.獲取準確的起始時間方法,將準確結束時間精確到納秒。
4.代碼優化,增加注釋和文檔等。
問題修復:
1.中國工作日計算問題修復
將放假日數據改為傳參:holidayData 放假信息0表示放假,1表示工作日,如:2021-01-01:0,2021-02-07:1。
//2021年放假信息
String holidayData = "2021-01-01:0,2021-02-07:1,2021-02-11:0,2021-02-12:0,2021-02-15:0,2021-02-16:0,2021-02-17:0,2021-02-20:1,2021-04-05:0,2021-04-25:1,2021-05-03:0,2021-05-04:0,2021-05-05:0,2021-05-08:1,2021-06-14:0,2021-09-18:1,2021-09-20:0,2021-09-21:0,2021-09-26:1,2021-10-01:0,2021-10-04:0,2021-10-05:0,2021-10-06:0,2021-10-07:0,2021-10-09:1";
軟體介紹:xk-time 是時間轉換,時間計算,時間格式化,時間解析,日曆,時間cron表達式和時間NLP等的工具,使用Java8,線程安全,簡單易用,多達70幾種常用日期格式化模板,支持Java8時間類和Date,輕量級,無第三方依賴。
xk-time is a tool for time conversion, time calculation, time formatting, time parsing, calendar, time cron expression and time NLP, etc. It uses Java8, thread-safe, easy to use, and more than 70 common date formatting templates , Support Java8 time class and Date, lightweight, no third-party dependencies.
安裝項目(1)Maven<dependency> <groupId>com.github.xkzhangsan</groupId> <artifactId>xk-time</artifactId> <version>3.0.1</version> </dependency>
(2)Gradlecompile group: 'com.github.xkzhangsan', name: 'xk-time', version: '3.0.1'
注意:Android謹慎使用,Android端因為需要兼容低版本而不支持Java8,建議繼續使用其他工具,如果有需要本項目相關的功能,可以參考源碼實現,或留言給我。感謝支持!為什麼要開發這個工具?(1)Java8以前的Date API設計不太好,使用不方便,往往會有線程安全問題。xk-time工具包,使用java8 api,其中Instant、LocalDate、LocalDateTime、LocalTime、ZonedDateTime等都是線程安全的類,而且增加了更豐富的方法,在此基礎上開發相關工具類,線程安全,讓使用更方便。
(2)常見的DateUtil,往往將時間轉換,計算,格式化,解析等功能都放在同一個類中,導致類功能複雜,方法太多,查找不方便。xk-time工具包,將上面功能按照時間轉換,時間計算,時間格式化解析分成3個工具類:DateTimeConverterUtil,DateTimeCalculatorUtil,DateTimeFormatterUtil,每個類只做一個種功能,方便使用。
(3)為了將與時間緊密相關的節假日、農曆、二十四節氣、十二星座、十二生肖、十二時辰和日曆等功能集中起來開發成工具,方便使用。主要功能說明1.日期轉換工具類 DateTimeConverterUtil包含Date、LocalDate、LocalDateTime、LocalTime、Instant、ZonedDateTime、YearMonth、Timestamp和long等互相轉換
注意,ZonedDateTime相關的轉換,尤其是其他時間轉ZonedDateTime,要注意時間和對應時區一致。
詳細使用可以查看相關測試代碼。
2.日期計算工具類 DateTimeCalculatorUtil包括:
(1)獲取時間屬性方法(支持年月日時分秒毫秒,星期,時間戳等),get* 比如getYear(Date date) 獲取年部分,getMonthCnLong(Date date)獲取月份中文,getDayOfWeekCn(Date date),獲取星期中文。
(2)獲取時間加操作方法,plus* 比如plusYears(Date date, long amountToAdd) 當前時間年增加amountToAdd值。
(3)獲取時間減操作方法,minus* 比如minusYears(Date date, long amountToSubtract) 當前時間年減少amountToSubtract值。
(4)獲取時間修改屬性方法,with* 比如withYear(Date date, long newValue) 修改當前時間年值為newValue。
(5)獲取比較2個時間方法,between* 比如betweenYears(Date startInclusive, Date endExclusive) 比較2個時間,獲取年部分。
(6)其他常用方法,比如isLeapYear(Date date) 判斷是否閏年,isWeekend(Date date) 判斷是否周末,isExpiry(String yearMonthStr) 是否過期等
(7)時區轉換計算方法,transform*,比如transform(ZonedDateTime zonedDateTime, String zoneId)
(8)比較2個時間大小和相等方法,compare*,比如compare(Date date1, Date date2)
(9)獲取準確的起始時間方法,start*,end*,比如startTimeOfMonth() 當月起始時間 當月第一天日期+00:00:00,endTimeOfMonth() 當月最後一天日期+23:59:59 精確到秒;endAccuracyTimeOf*,精確到毫秒(Date),精確到納秒(LocalDateTime)。
(10)相同月日比較判斷方法,isSameMonthDay*,betweenNextSameMonthDay*,nextSameMonthDay*, 比如用於生日,節日等周期性的日期比較判斷。
(11)星座計算方法,getConstellation*,比如getConstellationNameCn(String monthDayStr),根據日期計算星座。
(12)計算指定年月或起始時間區間的時間列表,get*List, 比如getDateList(int year, int month),計算指定年月的時間列表。
(13)減少時間精度方法,reduceAccuracyTo*, 比如reduceAccuracyToDay(Date date),減少時間精度到天,其他補0,返回如,2020-04-23 00:00:00。
(14)獲取時間戳方法,getEpoch*, 比如getEpochMilli()獲取時間戳,getEpochMilliFormat()獲取時間戳格式化字符串(yyyy-MM-dd HH🇲🇲ss)
(15)計算年齡方法,getAge*, 比如getAge(Date birthDay),通過生日計算年齡。
(16)判斷是否到生日方法,isBirthDay*, 比如isBirthDay(Date birthDay),根據生日判斷當前日期是否到生日。
(17)周數計算方法,weekof*, 比如weekOfMonth(Date date),日期所在月中第幾周。
(18)判斷星期一,星期五方法,isMonday*,isZhouYi*, 比如isZhouYi(Date date),是否為周一。
(19)十二時辰計算方法,getTwelveTwo*, 比如getTwelveTwo(Date date),獲取指定時間對應的十二時辰。
(20)季度計算方法,getQuarter*, 比如getQuarter(Date date),獲取指定時間對應的季度。
(21)獲取季度準確的起始時間方法(四個季度),startTimeOf*Quarter, 比如startTimeOfFirstQuarter(int year),獲取指定年的第一季度。
(22) 獲取年準確的起始時間方法,startTimeOfYear, 比如startTimeOfYear(int year),獲取指定年的開始時間。
(23)常用時間(明天,下周,下月,明年等)計算方法,比如tomorrow(),計算明天,返回Date。
(24)修改星期值方法 withDayOfWeek*,比如withDayOfWeek(Date date, long newValue),修改星期為指定值newValue,返回Date。
(25)中國工作日計算(將放假信息包含在內),包括判斷當前日期是否為工作日和下一個工作日等方法, isChineseWorkDay*,nextChineseWorkDay*,
比如 isChineseWorkDay(Date, String holidayData),nextChineseWorkDay(Date date, String holidayData),
節假日數據holidayData,如果節假日數據不支持年份,將使用周一到周五為工作日來判斷。
詳細使用可以查看相關測試代碼。
3.日期格式化和解析工具類 DateTimeFormatterUtil包含常用日期格式如:
yyyy-MM-dd
HH🇲🇲ss
yyyy-MM-dd HH🇲🇲ss
yyyy-MM-dd HH🇲🇲ss.SSS
yyyy-MM-dd HH🇲🇲ss.SSSSSS
yyyy-MM-dd HH🇲🇲ss.SSSSSSSSS
yyyy-MM-dd'T'HH🇲🇲ssZ等等 ,支持毫秒、微秒和納秒等精確時間。
(1)格式化方法, format*, 比如formatToDateStr(Date date) 格式化,返回日期部分,如:yyyy-MM-dd;
format(Date date, DateTimeFormatter formatter) formatter 可以選擇已定義好的formatter比如YYYY_MM_DD_HH_MM_SS_FMT(yyyy-MM-dd HH🇲🇲ss)格式化日期。
(2)解析方法, parse*, 比如parseDateStrToDate(String text) 解析日期yyyy-MM-dd,返回Date;
parseToDate(String text, DateTimeFormatter formatter) 根據 formatter解析為 Date。
(3)自動解析方法,根據字符串特點自動識別解析,smartParse*,比如smartParseToDate(String text) 自動解析Date。
(4)ISO格式(包含T)自動解析方法,根據字符串特點自動識別解析,parseIso*,比如parseIsoToDate(String text) 自動解析Date。
(5)解析時間戳方法, parseEpochMilli*, 比如parseEpochMilliToDate(String text),解析時間戳為Date,如 1590224790000。
(6)解析Date默認格式,parseDateDefaultStr*,比如parseDateDefaultStrToDate(String text)
解析 EEE MMM dd HH🇲🇲ss zzz yyyy 比如: Sat May 23 17:06:30 CST 2020 為Date。
(7)自定義時區格式化方法,比如 format(Date date, DateTimeFormatter formatter, String zoneId),根據zoneId格式化Date。
(8)自定義模板格式化方法,比如 format(Date date, String dateFormatPattern),根據dateFormatPattern格式化Date。
(9)自定義模板解析方法,比如 parseToDate(String text, String dateFormatPattern),根據dateFormatPattern格式化Date。
(10)Timestamp默認格式( yyyy-mm-dd hh🇲🇲ss.fffffffff 其中 fffffffff 納秒,省略後面的0)格式化方法。
比如 formatTimestampStyle(Date date)。
(11)Timestamp默認格式( yyyy-mm-dd hh🇲🇲ss.fffffffff 其中 fffffffff 納秒,省略後面的0)解析方法。
比如 parseTimestampStyleToDate(String text)。
(12)驗證日期格式是否正確方法,isValidDate*, 比如isValidDate(String text),驗證yyyy-MM-dd 格式字符串是否正確。
(13)根據自定義模板數組解析方法, 比如parseToDate(String text, String[] dateFormatPatterns),dateFormatPatterns 支持多種模板,只要其中一個解析成功就返回對應Date。
(14)解析自然語言時間,今天,明天,下周,下月,明年,昨天,上周,上月,去年等, 比如parseNaturalLanguageToDate(String text),
parseNaturalLanguageToDate(String text, Map<String, String> naturalLanguageMap) 支持自定義解析自然語言時間map
注意:格式化和解析與系統時區不同的時間時,使用自定義時區格式化方法,或可以使用withZone方法重新設置時區,比如:
YYYY_MM_DD_HH_MM_SS_SSS_FMT.withZone(ZoneId.of("Europe/Paris") 。
詳細使用可以查看相關測試代碼。
4.日曆工具類 CalendarUtil包括:
(1)生成指定時間的日曆(包含年、月和日層級關係的日曆)方法,generateCalendar* 比如generateCalendar(int year, int month) 生成指定年月的日曆。
(2)生成指定時間的日曆(包含年、月和日層級關係的日曆),包含農曆和所有節假日信息方法,generateCalendarWithHoliday*, 比generateCalendarWithHoliday(int year, int month, Map<String, String> localHolidayMap,Map<String, String> chineseHolidayMap, Map<String, Integer> dateTypeMap)生成指定年月的日曆,包含農曆和所有節假日信息,可以自定義節假日和工作日等。
詳細使用可以查看相關測試代碼。
5.農曆日期類 LunarDate包含:
(1)農曆日期年月日計算。
(2)農曆歲次,生肖屬相計算。
(3)二十四節氣計算等
注意: 僅支持公曆1900-2100年的農曆轉換。
詳細使用可以查看相關測試代碼。
6.節假日計算工具類 HolidayUtil包含:
(1)公曆節假日計算, getLocalHoliday* 比如getLocalHoliday(Date date) 計算date的公曆節日,getLocalHoliday(Date date, Map<String, String> localHolidayMap) 可以傳入自定義公曆節日數據。
(2)農曆節假日計算, getChineseHoliday* 比如getChineseHoliday(Date date) 計算date的農曆節日,getChineseHoliday(Date date, Map<String, String> chineseHolidayMap) 可以傳入自定義農曆節日數據。
(3)二十四節氣計算, getSolarTerm* 比如getSolarTerm(Date date) 計算date的二十四節氣。
注意: 農曆和二十四節氣使用農曆日期類 LunarDate,僅支持公曆1900-2100年的計算。
詳細使用可以查看相關測試代碼。
7.Cron表達式工具類 CronExpressionUtilcron表達式從左到右(用空格隔開):秒(0-59) 分(0-59) 小時(0-23) 日期(1-31) 月份(1-12的整數或者 JAN-DEC) 星期(1-7的整數或者 SUN-SAT (1=SUN)) 年份(可選,1970-2099)
所有欄位均可使用特殊字符:, - * / 分別是枚舉,範圍,任意,間隔
日期另外可使用:? L W 分別是任意,最後,有效工作日(周一到周五)
星期另外可使用:? L # 分別是任意,最後,每個月第幾個星期幾
常用cron表達式:
(1)0 0 2 1 * ? * 表示在每月的1日的凌晨2點觸發
(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15執行作業
(3)0 15 10 ? * 6L 2002-2006 表示2002-2006年的每個月的最後一個星期五上午10:15執行作
(4)0 0/30 9-17 * * ? 朝九晚五工作時間內每半小時
(5)0 15 10 L * ? 每月最後一日的上午10:15觸發
(6)0 15 10 ? * 6#3 每月的第三個星期五上午10:15觸發
包含
(1)驗證和格式化Cron表達式方法,isValidExpression和formatExpression。
(2)生成下一個或多個執行時間方法,getNextTime和getNextTimeList。
(3)生成下一個或多個執行時間的日期格式化(yyyy-MM-dd HH🇲🇲ss)方法,getNextTimeStr和getNextTimeStrList。
(4)對比Cron表達式下一個執行時間是否與指定date相等方法,isSatisfiedBy。
注意: 底層使用 quartz的CronExpression處理。
詳細使用可以查看相關測試代碼。
8.計算耗時工具 CostUtil計算耗時工具,支持秒,毫秒,納秒
包括:
(1)計算耗時,返回耗時結果。
(2)計算耗時,自定義任務名稱,輸出耗時結果。
(3)計算耗時,返回精確計時,帶3小數的結果,使用ROUND_DOWN 捨棄超過3位的小數部分等。
詳細使用可以查看相關測試代碼。
9.時間自然語言分析工具類(NLP) TimeNLPUtil包括功能:
(1)以當前時間為基礎分析時間自然語言。
(2)以指定時間為基礎分析時間自然語言。
修改自 https://github.com/shinyke/Time-NLP
做了一些修改如下:
(1)封裝屬性,重命名使符合駝峰命名標準。
(2)將加載正則資源文件改為單例加載。
(3)將類按照功能重新劃分為單獨的多個類。
(4)使用Java8日期API重寫。
(5)增加注釋說明,優化代碼。
(6)修復原項目中的issue:標準時間yyyy-MM-dd、yyyy-MM-dd HH🇲🇲ss和yyyy-MM-dd HH:mm解析問題。
(7)修復原項目中的issue:1小時後,1個半小時後,1小時50分鐘等解析問題;並且支持到秒,比如50秒後,10分鐘30秒後等。
(8)修復原項目中的issue:修復當前時間是上午10點,那麼下午三點 會識別為明天下午三點問題。
(9)修復原項目中的issue:修復小數解析異常問題。
注意:NLP會有一定的識別失敗率,在不斷迭代開發提高成功率。
詳細使用可以查看相關測試代碼。
更多詳細文檔參與項目1.提bug和建議2.貢獻代碼(1)fork項目。
(2)在dev分支修改。
(3)提交pull request。