Java 時間工具包 xk-time 3.0.1 發布,中國工作日計算問題修復

2021-01-07 開源中國
xk-time 3.0.1 已經發布 ,更新如下:

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)Gradle

compile 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表達式工具類 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🇲🇲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。

相關焦點

  • xk-time 2.2.0 發布,Java 時間工具包,支持解析自然語言時間,明天...
    2.支持解析自然語言時間,今天,明天,下周,下月,明年,昨天,上周,上月,去年等,支持自定義解析自然語言時間。3.日期計算工具類優化,提高性能。4.完善注釋文檔,生成javadoc的API在線文檔: https://apidoc.gitee.com/xkzhangsan/xk-time/ 。5.代碼優化。
  • 新一代Java web報表工具—Smartbi電子表格的優勢
    軟體的安裝Smartbi電子表格軟體運行在Java環境下,安裝包集合了JDK、Tomcat,還內置了Mysql資料庫。報表設計器直接使用Excel,但需要安裝插件,Excel插件安裝完成後,會增加一個Smartbi功能區。
  • Lettuce 5.0.3 和 4.4.4 發布,Redis Java 客戶端
    Lettuce 5.0.3 和 4.4.4 已發布,Lettuce 是一個可伸縮線程安全的 Redis 客戶端。多個線程可以共享同一個 RedisConnection。
  • 如何在excel中實現工作日的計算
    這是excel提供的一個雖然簡單卻相當實用的日期計算功能。   然而,這一功能在實際工作中的局限性,使其無法滿足更高層次的需要,特別是「工作日」這一概念逐漸在各領域被廣泛應用的今天,許多工作都需要進行與之相關的計算。最常見的比如員工的出勤天數、交貨期的計算、付款日的計算等等。excel為用戶的這些需求提供了怎樣的解決方案呢?
  • 你了解java中的幾種編碼方式?解決亂碼問題可能並不麻煩
    由於之前就知道String中的轉換方式,還有一些工具類,因此今天就好好的整理一下java中jdk提供的幾種轉換方式,希望對你有幫助。一、編碼轉換原理1、為什麼需要編碼我們知道計算機存儲信息的最小單位是一個字節8位,能夠表示256個字符。這對於早起的英文來說足夠了。即使是加上一些常見符號也足夠。
  • iOS 12.0.1更新修復iPhone Xs Wifi連接及設備無法充電問題
    但還有為數不少的一批人(包括曾經的筆者在內),指責這臺新手機Wi-Fi信號不好,另外就是LTE 4G網絡連接也有問題。而iPhone Xs作為蘋果今年的扛把子產品,面對問題自然是不敢怠慢的。這不,中國國慶節剛過蘋果就放出了iOS 12.0.1升級更新。
  • Lettuce 5.0.2 和 4.4.3 發布,Redis Java 客戶端
    Lettuce 5.0.2 和 4.4.3 已發布,Lettuce 是一個可伸縮線程安全的 Redis 客戶端。多個線程可以共享同一個 RedisConnection。
  • 人事必學,計算一個月有多少個工作日
    人事工作中,在核算工資或考勤的時候,首先要計算本月有多少個工作日,有的小夥伴可能就直接數一數上了幾天班,但是如果會用Excel公式的話, 就很簡單了,也不會出錯1、周六周日休息制不考慮法定節假日的變化,只是周六周日休息,就可以使用公式:=NETWORKDAYS
  • Apache Lucene 7.5.0 發布,Java 全文搜尋引擎
    Apache Lucene 7.5.0 已發布。
  • Excel怎樣計算去除單休、雙休、節假日後的有效工作日
    問題:有兩個日期,我要計算它們之間有多少個工作日,怎麼辦?我們知道不同的公司有不同的作息制度,有周末雙休、有單休、有各種節假日等,所以需要根據不同的情況使用不同的公式計算。公式「=NETWORKDAYS(日期1,日期2)」會自動用「日期2-日期1」,同時去除周六和周日,得到實際工作日天數。③ 除了周末雙休,還有法定節假日也不上班。我們可以把「清明」、「五一」、「端午」等一系列特色節假日存放在一個表裡,然後用公式「=NETWORKDAYS(日期1,日期2,節假日表)」計算扣除了休息日和節假日後的準確工作日天數。
  • 關於matlab程序運行時間計算方法的思考
    上一段程序結果如下:  Elapsed time is 3.720372 seconds.函數則是計算兩個時間矢量之間的差並以秒單位形式表示。clock作為時間矢量包含了年月日時分秒六個參數,如在matlab單獨執行這一命令可得到:  >> clock  ans =  1.0e+003 *  2.0120 0.0080 0.0180 0.0140 0.0180 0.0507  3、cputime命令計算運行時間;
  • 一個月有多少個工作日,你會計算了嗎?
    在人事部的日常工作中,都要計算每個月有多少個工作日,以方便計算出勤工資,今天小編就和大家分享兩種快速計算一個月有多少個工作日的方法。以2020年1月為例,這個月份有有元旦和春節假期。第一種:每周雙休的工作日計算在E5單元格中輸入公式:=NETWORKDAYS(B5,C5,D5:D12)即可計算出工作日天數。NETWORKDAYS函數第一個參數為開始日期,第二個參數為結束日期,第三個參數是需要排除的法定節假日,如果沒有可以省略。
  • java編程中'為了性能'一些儘量做到的地方
    下面是參考網絡資源和總結一些在java編程中儘可能做到的一些地方 - 1.儘量在合適的場合使用單例 使用單例可以減輕加載的負擔,縮短加載的時間,提高加載的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方面 第一,控制資源的使用,通過線程同步來控制資源的並發訪問
  • 中國科學院大學科學計算中心-高性能異構科學計算系統採購項目公開...
    9239-招標公告.docx 附件2 9239-868-科學計算中心-異構科學計算系統採購項目-招標文件-【發售】.doc 項目概況中國科學院大學科學計算中心-高性能異構科學計算系統採購項目 招標項目的潛在投標人應在北京市海澱區學院路30號科大天工大廈A座六層608室。
  • 實時計算 Flink 與你相約阿里雲
    計算的實體是數據,但是隨著時間的推移,數據的價值其實是逐漸遞減的。如何從數據產生開始,儘早地發掘它的最大價值,成為實時計算不懈追求的目標。隨著技術的發展, Flink 已經成為實時計算的工業標準,越來越多的公司正在使用 Flink 作為自己實時計算的工具。在實時計算領域,阿里雲也在不斷地探索,並推出了實時計算 Flink 的產品。
  • NeuroRA:一個用於多模態神經數據表徵分析的Python工具包
    表徵相似性分析(representational similarity analysis, RSA)作為MVPA方法的一種,通過計算不同條件下大腦中不同表徵之間的相似度,已經成為一種有效的用於解碼神經數據的方法。此外,RSA適用於研究人員比較來自不同模態、甚至不同物種之間的數據。然而,傳統用於計算RSA的工具包都存在各種局限性,且易用性不足。
  • 勞動部調整職工工作時間計算和日工資折算辦法
    新華網北京1月10日電(記者 劉錚)勞動保障部10日公布的通知指出,根據《全國年節及紀念日放假辦法》,節日假期由原來的10天增設為11天,職工制度工作時間的計算和日工資、小時工資的折算辦法分別作出調整。
  • TensorFlow 1.7.0 發布,新增 Debugger Dashboard
    TensorFlow 1.7.0 正式版已發布,主要特性和改進包括:Eager 模式正在從 contrib 中移出, 請嘗試 tf.enable_eager_execution(
  • J2Cache 2.7.0 發布了,支持 Lettuce 替代 Jedis
    J2Cache 2.7.0 在周末悄沒聲息的發布了!!!
  • Neptune 5.4 發布,基於 Ubuntu 的 Linux 發行版
    Neptune 5.4 發布了,Neptune 的前身是 ZevenOS。