Java日期時間API系列32-----Jdk8中java.time包中的新的日期時間API類應用,時間工具包 xk-time 1.0.0 版本完成。

  從Java日期時間API系列第一篇博客開始,利用業餘時間對Java日期時間API源碼進行了系統的、多次的閱讀實踐,包括Date、LocalDate、LocalDateTime、LocalTime、Instant、ZonedDateTime、YearMonth和Timestamp等源碼,把和時間緊密相關的內容,整理寫成一個Java時間工具包xk-time,經過了多個版本迭代0.0.1-0.0.8,基本的功能已經完成。現在發佈 1.0.0 版本。

xk-time

xk-time is a datetime converter calculator formatter calendar and cron expression tool set, based on java8 date and time API, thread safe, easy to use.

時間轉換,計算,格式化,解析,日曆和cron表達式等的工具,使用java8,線程安全,簡單易用,多達20幾種常用日期格式化模板。

0.爲什麼要開發這個工具?

(1)java8以前的Date API設計不太好,使用不方便,往往會有線程安全問題。

xk-time工具包,使用java8 api,其中Instant、LocalDate、LocalDateTime、LocalTime、ZonedDateTime等都是線程安全的類,而且增加了更豐富的方法,在此基礎上開發相關工具類,線程安全,讓使用更方便。

(2)常見的DateUtil,往往將時間轉換,計算,格式化,解析等功能都放在同一個類中,導致類功能複雜,方法太多,查找不方便。

xk-time工具包,將上面功能按照時間轉換,時間計算,時間格式化解析分成3個工具類:DateTimeConverterUtil,DateTimeCalculatorUtil,DateTimeFormatterUtil,每個類只做一個種功能,方便使用。

(3)爲了將與時間緊密相關的節假日、農曆、二十四節氣、十二星座和日曆等功能集中起來開發成工具,方便使用。

1.依賴

<dependency>  
  <groupId>com.github.xkzhangsan</groupId>    
  <artifactId>xk-time</artifactId>       
  <version>1.0.0</version>    
</dependency>    

2.日期轉換工具類 DateTimeConverterUtil

包含Date、LocalDate、LocalDateTime、LocalTime、Instant、ZonedDateTime、YearMonth和Timestamp的互相轉換
注意,ZonedDateTime相關的轉換,尤其是其他時間轉ZonedDateTime,要注意時間和對應時區一致。

詳細使用可以查看相關測試代碼。

3.日期計算工具類 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。
(10)相同月日比較判斷方法,isSameMonthDay*,betweenNextSameMonthDay*,nextSameMonthDay*, 比如用於生日,節日等週期性的日期比較判斷。
(11)星座計算方法,getConstellation*,比如getConstellationNameCn(String monthDayStr),根據日期計算星座。
(12)計算指定年月或起始時間區間的時間列表,getList, 比如getDateList(int year, int month),計算指定年月的時間列表。
(13)減少時間精度方法,reduceAccuracyTo
, 比如reduceAccuracyToDay(Date date),減少時間精度到天,其他補0,返回如,2020-04-23 00:00:00。

詳細使用可以查看相關測試代碼。

4.日期格式化和解析工具類 DateTimeFormatterUtil

包含常用日期格式如:
yyyy-MM-dd
HH:mm:ss
yyyy-MM-dd HH:mm:ss
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。

注意:格式化和解析ZonedDateTime 時區時間時,只能使用ISO開頭 的Formatter,如ISO_DATE_FMT和YYYY_MM_DD_T_HH_MM_SS_Z_FMT
因爲,其他Formatter都綁定的是系統默認時區: private static final ZoneId ZONE = ZoneId.systemDefault();

如果需要使用其他Formatter,可以使用withZone方法重新設置時區,比如:
YYYY_MM_DD_HH_MM_SS_SSS_FMT.withZone(ZoneId.of("Europe/Paris")

詳細使用可以查看相關測試代碼。

5.日曆工具類 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)生成指定年月的日曆,包含農曆和所有節假日信息,可以自定義節假日和工作日等。

詳細使用可以查看相關測試代碼。

6.農曆日期類 LunarDate

包含:
(1)農曆日期年月日計算。
(2)農曆歲次,生肖屬相計算。
(3)二十四節氣計算等
注意: 僅支持公曆1901-1950年的農曆轉換。
農曆和二十四節氣計算的準確依賴於lunarInfo和solarTermInfo基礎數據的準確性和精確度。
根據測試結果,發現本程序和常用萬年曆軟件中都有很少量計算誤差,歡迎提出問題,會不斷進行改進和修正。

詳細使用可以查看相關測試代碼。

7.節假日計算類 Holiday

包含:
(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,僅支持公曆1901-1950年的計算。

詳細使用可以查看相關測試代碼。

8.Cron表達式工具類 CronExpressionUtil

cron表達式從左到右(用空格隔開):秒(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:mm:ss)方法,getNextTimeStr和getNextTimeStrList。
(4)對比Cron表達式下一個執行時間是否與指定date相等方法,isSatisfiedBy。

注意: 底層使用 quartz的CronExpression處理。

詳細使用可以查看相關測試代碼。

歡迎提問題和建議!

 

源代碼地址:https://github.com/xkzhangsan/xk-time

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章