天天看點

db29.7時間格式化為時間到時分秒_Java日期時間API系列21-----Jdk8,xk-time時間轉換,計算,格式化,解析的工具...

  通過工作之餘,對Java8中java.time包源碼的不斷學習,使用和總結,開發了xk-time,歡迎試用和提出建議!

原文中為0.0.2版本的描述,下面是最新版本1.1.3的說明:

xk-time 是時間轉換,計算,格式化,解析,月曆和cron表達式等的工具,使用Java8,線程安全,簡單易用,多達70幾種常用日期格式化模闆,支援Java8時間類和Date,輕量級,無第三方依賴。

xk-time is a tool for time conversion, calculation, formatting, parsing, calendar and cron expression, etc., using Java8, thread-safe, easy to use, up to 70 commonly used date formatting templates, support Java8 time class and Date , Lightweight, no third party dependence.

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

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

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

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

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

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

1.Maven 坐标

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

2.日期轉換工具類 DateTimeConverterUtil

包含Date、LocalDate、LocalDateTime、LocalTime、Instant、ZonedDateTime、YearMonth、Timestamp和long等互相轉換

注意,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)計算指定年月或起始時間區間的時間清單,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),根據生日判斷目前日期是否到生日。

詳細使用可以檢視相關測試代碼。

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

包含常用日期格式如:

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 格式字元串是否正确。

注意:格式化和解析與系統時區不同的時間時,使用自定義時區格式化方法,或可以使用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-2050年的農曆轉換。

農曆和二十四節氣計算的準确依賴于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-2050年的計算。

詳細使用可以檢視相關測試代碼。

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處理。

詳細使用可以檢視相關測試代碼。

xk-time 0.0.2版本 核心功能如下:

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

原因1:常見的DateUtil,往往将時間轉換,計算,格式化,解析等功能都放在同一個類中,導緻類功能複雜,方法太多,查找不友善。

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

原因2:java8以前的Date API設計不太好,往往會有線程安全問題

使用java8api,Instant、LocalDate、LocalDateTime、LocalTime、ZonedDateTime等都是線程安全的類,而且增加了更豐富的方法,在此基礎上開發相關工具類,線程安全,讓使用更友善。

1.依賴

<dependency>  
  <groupId>com.github.xkzhangsan</groupId>    
  <artifactId>xk-time</artifactId>       
  <version>最新版本</version>    
</dependency>
           

2.日期轉換 DateTimeConverterUtil

包含Date、LocalDate、LocalDateTime、LocalTime、Instant和ZonedDateTime的互相轉換

注意,ZonedDateTime相關的轉換,尤其是其他時間轉ZonedDateTime,要注意時間和對應時區一緻。

3.日期計算工具類 DateTimeCalculatorUtil

包括:

(1)擷取時間屬性方法,get* 比如getYear(Date date) 擷取年部分。

(2)擷取時間加操作方法,plus* 比如plusYears(Date date, long amountToAdd) 目前時間年增加amountToAdd值。

(3)擷取時間減操作方法,minus* 比如minusYears(Date date, long amountToAdd) 目前時間年減少amountToAdd值。

(4)擷取時間修改屬性方法,with* 比如withYear(Date date, long newValue) 修改目前時間年值為newValue。

(5)擷取比較2個時間方法,between* 比如betweenYears(Date startInclusive, Date endExclusive) 比較2個時間,擷取年部分。

(6)其他常用方法,比如isLeapYear(Date date) 判斷是否閏年。

(7)時區轉換計算方法,transform*,比如transform(ZonedDateTime zonedDateTime, String zoneId)

(8)比較2個時間大小和相等方法,compare*,比如compare(Date date1, Date date2)

4.日期格式化和解析DateTimeFormatterUtil

包含常用日期格式如:

yyyy-MM-dd

HH:mm:ss

yyyy-MM-dd HH:mm:ss

yyyy-MM-dd'T'HH:mm:ssZ等等

注意:格式化和解析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")

源碼位址:

xkzhangsan/xk-time​github.com

db29.7時間格式化為時間到時分秒_Java日期時間API系列21-----Jdk8,xk-time時間轉換,計算,格式化,解析的工具...