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

2021-01-09 開源中國
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。

相關焦點

  • smart-doc 1.9.7 發布,Java 零註解文檔生成工具
    smart-doc完全基於接口源碼分析來生成接口文檔,完全做到零註解侵入,你只需要按照java標準注釋編寫,smart-doc就能幫你生成一個簡易明了的markdown 或是一個像GitBook樣式的靜態html文檔。如果你已經厭倦了swagger等文檔工具的無數註解和強侵入汙染,那請擁抱smart-doc吧!
  • aio-enhance v1.0.2 發布,Java AIO 內核增強類庫
    一、項目背景2.1 解決平臺兼容性問題。Java 原生 AIO 在 Mac 作業系統下存在兼容性問題,進行性能壓測會偶發性的系統崩潰。2.3 優化 AIO 線程模型Java AIO 相較於 NIO 多了一層異步線程模型,極大降低了開發人員的編程難度。但是通信過程中的 accept、connect、read、write 等事件都是復用同一組線程資源,容易造成讀寫回調進入死鎖狀態。
  • Java 生成隨機數的 5 種方式,你知道幾種?
    1. Math.random() 靜態方法 產生的隨機數是 0 - 1 之間的一個 ,即 。 什麼情況下隨機數的生成線程不安全: 線程1在第一次調用 時產生一個生成器 ,使用當前時間作為種子。 線程2在第一次調用 時產生一個生成器 ,使用當前時間作為種子。
  • Redis 3.0.0 RC4 發布,無 Redis Cluster 修復
    Redis 3.0.0 RC4 發布,此版本是唯一不包括 Redis Cluster bug 修復的 RC 版本!
  • Quarkus 1.7.0.Final 發布,Java 雲原生、容器優先框架
    Quarkus 1.7.0.Final 現已發布。
  • 打工人打工魂,打工的必會java調用python的幾種用法
    遇到這種情況推薦使用下面的方法,即可解決該問題。第三方庫,並初始化了一個3×4的一個矩陣。而sys.argv[0]代表python程序名,所以列表從1開始讀取參數。('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) if not words: return None # res = [[item[0], item[1]] for item in words] # 相似關鍵詞及其相似度 res = [] for word in words: res.append
  • 微軟認知工具Cognitive Toolkit 2.0 完整版發布!速度是對手的3倍
    5.多漏洞修復該工具包最初於2016年10月推出測試版,自那以後,團隊就一直處於測試階段。直至本周一,微軟終於宣布該工具包已經可以應用於產品上。微軟全球技術院士黃學東博士對此表示,Microsoft Cognitive Toolkit的1.0版本其實很大程度上是設計給微軟內部使用的,然後再將其適用於外部。因為它本質上是一個內部工具,所以也不支持 Python ,即使 Python 是當時最受開發者歡迎的機器學習架構。
  • Hutool 4.1.2 發布,Java 工具集 - OSCHINA - 中文開源技術交流社區
    Hutool是一個 Java 工具包,也只是一個工具包,它幫助我們簡化每一行代碼,減少每一個方法,讓 Java 語言也可以"甜甜的"。Hutool 最初是我項目中util包的一個整理,後來慢慢積累並加入更多非業務相關功能,並廣泛學習其它開源項目精髓,經過自己整理修改,最終形成豐富的開源工具集。此次主要更新為簡化了DB模塊的操作,這部分文檔見:http://hutool.mydoc.io/?
  • Stellarium 0.20.3 發布,開源 3D 天象模擬軟體
    Stellarium ​​0.20.3 已發布。Stellarium 是一款免費開源 GPL(自由軟體基金會 GNU 通用公共許可證)軟體,它使用 OpenGL 圖形接口對星空進行實時渲染。
  • 在線代碼審查工具 Review Board 2.5.17 和 3.0.1 發布
    在線代碼審查工具 Review Board 2.5.17 已發布,同時發布的還有 3.0.1 版本,主要是一些 Bug 修復和功能改進
  • ClouderaManager6.3.1+CDH6.3.2+PHOENIX-5.0.0集成部署
    內容提要:1.初始資源2.版本選型3.環境和安裝包3.1 部署方式3.2 CM安裝包3.3 Parcel包3.4 JDK部署3.5 MySQL安裝部署3.6 mysql-connector-java.jar
  • PDFBox 2.0.6 發布,Java 的 PDF 處理類庫
    -3313] - Java 9 InaccessibleObjectException[PDFBOX-3318] - IllegalArgumentException in PDPageTree constructor: root cannot be null[PDFBOX-3347] - COSName parsing doesn't handle ISO-8859-1
  • ECharts-Java 類庫 2.2.6 版本發布
    ECharts - Java類庫當前版本2.2.6 本項目是一個供Java開發使用的ECharts的開發包,主要目的是方便在Java
  • NumPy 1.18.0 發布,Python 科學計算包
    NumPy 1.18.0 已發布。除了通常的錯誤修復之外,此版本還清理並記錄新的隨機 C-API,使大量舊版本棄用,並改善了文檔的外觀。
  • Quarkus 1.0 發布,Java 雲原生、容器優先框架
    Quarkus 1.0 發布了。Quarkus 是一個用於編寫 Java 應用的雲原生、容器優先框架。
  • NumPy v1.14.1 發布,Python 科學計算包
    NumPy 是一個 Python 基礎科學計算包,包含:NumPy v1.14.1 已發布,這是針對 1.14.0 版本報告的一些 bug 的修補版本。
  • 阿里巴巴 canal 開源組件發布 v1.1.3 版本
    經歷了 4 個月的蟄伏,canal 1.1 系列的 1.1.3 正式發布了,主要圍繞自建的生態能力,完善消息投遞到 MQ 和 Client Adapter 做了比較多的測試和修復工作,具體的變更日誌:功能新增 支持 MySQL 8.0 新的 caching_sha2_password 認證協議 支持 Azure MySQL 的認證協議
  • StepChain 0.0.7 發布,Java 通用業務處理框架
    0.0.7更新日誌:1、新增支持Processor定時調度FixedRate、FixedDelay。2、修復0.0.6版本bug.
  • 俠說java8-LocalDateTime等時間使用手冊(全),先mark後看
    前言java8的時間日期api給我們提供了極大的便利。如何更好的熟悉使用時間api也是學習java8的一個很重要的知識點,下面我們一起來學習學習。本篇文章代碼比較多,可以作為工具,需要使用時,再來查閱。目錄1.普通Date時間如何轉為LocalDateTime?
  • Robocode 1.9.2.4發布,坦克機器人戰鬥仿真引擎
    最新發布的Robocode 1.9.2.4維護版本修復了之前版本中的兩個漏洞並做了兩處修改。解決了包括Debian下的Robocode在內的發行版中的各種問題。Robocode 1.9.2.4 更新漏洞修復修復了靜態欄位過於殺傷力的垃圾回收機制—實際上Robocode上任何靜態欄位中的垃圾回收機制防止了內存洩露。