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.
<dependency>
<groupId>com.github.xkzhangsan</groupId>
<artifactId>xk-time</artifactId>
<version>3.2.4</version>
</dependency>
Mini版本不包含 time nlp 功能,更简洁。
<dependency>
<groupId>com.github.xkzhangsan</groupId>
<artifactId>xk-time</artifactId>
<version>3.2.4.Mini</version>
</dependency>
compile group: 'com.github.xkzhangsan', name: 'xk-time', version: '3.2.4'
xk-time工具包,使用java8 api,其中Instant、LocalDate、LocalDateTime、LocalTime、ZonedDateTime等都是線程安全的類,而且增加了更豐富的方法,在此基礎上開發相關工具類,線程安全,讓使用更方便。
xk-time工具包,將上面功能按照時間轉換,時間計算,時間格式化解析分成3個工具類:DateTimeConverterUtil,DateTimeCalculatorUtil,DateTimeFormatterUtil,每個類只做一個種功能,方便使用。
2.4.1 joda-time和Java8 time包實現基本相同,都是Stephen Colebourne主導的,從Java8開始,推薦使用java8 time包替換joda-time。
2.4.2 xk-time是基於Java8日期api的,是一個補充工具,和以前的dateutil類似。
(1)Java8的類庫是層級實現縱向的,xk-time則是按照通用功能橫向的,比如轉換,計算,格式化解析分為3個類等。
(2)Java8 Date轉換成新類,需要查看api文檔,xk-time則在內部轉換好,使Date可以直接使用Java8的新功能。
(3)xk-time把dateutil的常用功能重新按照Java8的Api實現,同時做了一些擴展,使用更方便。
包含:
(1)Date、LocalDate、LocalDateTime、LocalTime、Instant、ZonedDateTime、YearMonth、Timestamp、時間戳和TemporalAccessor等互相轉換。
(2)天、小時、分鐘、秒和毫秒等時間單位相互轉換,支持小單位到大單位的精確轉換比如,minuteToHourPrecise(long num) 90分鐘轉換為小時,為1.5小時。
(3)轉換ZonedDateTime的同時支持轉換為指定時區,比如toZonedDateTime(Date date, String zoneId) ,toZonedDateTimeAndTransformZone(LocalDateTime localDateTime, String targetZoneId)。
注意,ZonedDateTime相關的轉換,尤其是其他時間轉ZonedDateTime,要注意時間和對應時區一致。
詳細使用可以查看相關測試代碼: DateTimeConverterUtilTest.
包括:
(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* 比如betweenTotalDays(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:mm: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,如果節假日數據不支持年份,將使用周一到週五為工作日來判斷。 下面是我整理的2021年放假信息:
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-0 5-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
(26)判斷2個或多個時間段是否有重疊(交集)方法, isOverlap*,比如isOverlap(Date startDate1, Date endDate1, Date startDate2, Date endDate2),重疊返回true。
(27)計算平均時間方法,averageTime*,比如averageTime(List dateList),返回平均時間,比如"15:03:03"。
(28)根據毫秒值計算倒計時方法,支持支持傳入時間對象和指定格式,countdown*,比如countdown(long millis),返回倒計時,比如"27小時10分鐘30秒"。
(29)獲取指定區間的格式化時間列表方法,比如getDateFormatList(Date start, Date end, String dateFormatPattern) 支持傳入格式化模板。
(30)計算2個時間段的重疊(交集)時間方法,比如overlapTime(Date startDate1, Date endDate1, Date startDate2, Date endDate2),返回毫秒值。
詳細使用可以查看相關測試代碼: DateTimeCalculatorUtilTest.
包含常用日期格式如:
yyyy-MM-dd
HH:mm:ss
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd HH:mm:ss.SSS
yyyy-MM-dd HH:mm:ss.SSSSSS
yyyy-MM-dd HH:mm:ss.SSSSSSSSS
yyyy-MM-dd'T'HH:mm: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:mm: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:mm: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:mm:ss.fffffffff 其中fffffffff 納秒,省略後面的0)格式化方法。
比如formatTimestampStyle(Date date)。
(11)Timestamp默認格式( yyyy-mm-dd hh:mm: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。
(15)中文日期格式化方法,比如formatToChineseDateStr(Date date, boolean isUpperCase),isUpperCase false:2021年09月11日true: 二〇二一年九月十一日。
(16)中文日期解析方法,比如parseChineseDateStrToDate(String text),支持:2021年09月11日和二〇二一年九月十一日格式日期解析。
注意:格式化和解析與系統時區不同的時間時,使用自定義時區格式化方法,或可以使用withZone方法重新設置時區,比如:
YYYY_MM_DD_HH_MM_SS_SSS_FMT.withZone(ZoneId.of("Europe/Paris") 。
詳細使用可以查看相關測試代碼: DateTimeFormatterUtilTest.
包括:
(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)生成指定年月的日曆,包含農曆和所有節假日信息,可以自定義節假日和工作日等。
詳細使用可以查看相關測試代碼: CalendarUtilTest.
包含:
(1)農曆日期年月日計算。
(2)農曆歲次,生肖屬相計算。
(3)二十四節氣計算等(4)農曆轉公曆注意: 僅支持公曆1900-2100年的農曆轉換。
詳細使用可以查看相關測試代碼: LunarDateTest.
包含:
(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年的計算。
詳細使用可以查看相關測試代碼。
cron表達式從左到右(用空格隔開):秒(0-59) 分(0-59) 小時(0-23) 日期(1-31) 月份(1-12的整數或者JAN-DEC) 星期(1-7的整數或者SUN-SAT (1=SUN)) 年份(可選,1970-2099)
所有字段均可使用特殊字符:, - * / 分別是枚舉,範圍,任意,間隔日期另外可使用:? LW 分別是任意,最後,有效工作日(週一到週五)
星期另外可使用:? 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:mm:ss)方法,getNextTimeStr和getNextTimeStrList。
(4)對比Cron表達式下一個執行時間是否與指定date相等方法,isSatisfiedBy。
注意: 底層使用quartz的CronExpression處理。
詳細使用可以查看相關測試代碼: CronExpressionUtilTest.
計算耗時工具,支持秒,毫秒,納秒
包括:
(1)計算耗時,返回耗時結果。
(2)計算耗時,自定義任務名稱,輸出耗時結果。
(3)計算耗時,返回精確計時,帶3小數的結果,使用ROUND_DOWN 捨棄超過3位的小數部分等。
詳細使用可以查看相關測試代碼:CostUitlTest.
包括功能:
(1)以當前時間為基礎分析時間自然語言。
(2)以指定時間為基礎分析時間自然語言。
(3)增加多種調用方式,比如parseConcurrent 並發執行,可設置超時時間和自定義線程池等,提高執行效率。
修改自https://github.com/shinyke/Time-NLP
做了一些修改如下:
(1)封裝屬性,重命名使符合駝峰命名標準。
(2)將加載正則資源文件改為單例加載。
(3)將類按照功能重新劃分為單獨的多個類。
(4)使用Java8日期API重寫。
(5)增加註釋說明,優化代碼。
(6)修復原項目中的issue:標準時間yyyy-MM-dd、yyyy-MM-dd HH:mm:ss和yyyy-MM-dd HH:mm解析問題。
(7)修復原項目中的issue:1小時後,1個半小時後,1小時50分鐘等解析問題;並且支持到秒,比如50秒後,10分鐘30秒後等。
(8)修復原項目中的issue:修復當前時間是上午10點,那麼下午三點會識別為明天下午三點問題。
(9)修復原項目中的issue:修復小數解析異常問題。
(10)性能優化,將使用到的正則預編譯後放到緩存中,下次直接使用,提高性能。
注意:NLP會有一定的識別失敗率,在不斷迭代開發提高成功率。
Mini版本不包含此功能。
詳細使用可以查看相關測試代碼: TimeNLPUtilTest.
時間單位常量,方便計算單位換算,比如設置緩存時間3天: 3*MILLISECONDS_PER_DAY (每天毫秒數24*60*60*1000)
包含:
(1)基本單位換算數值,比如MILLISECONDS_PER_SECONDS 每秒毫秒數1000。
(2)轉換為秒數基本數值,比如SECONDS_PER_DAY 每天秒數24*60*60。
(3)轉換為毫秒基本數值,比如MILLISECONDS_PER_DAY 每天毫秒數24*60*60*1000。
詳細使用可以查看相關測試代碼: XkTimeConstantTest.
(1)fork項目。
(2)在dev分支修改。
(3)提交pull request。
(1)常見節假日,比如元旦、春節、清明節、勞動節、端午節、中秋節等節假日支持。
(2)24節氣支持。