# xk-time
<p align="center">
<a target="_blank" href="https://www.oracle.com/technetwork/java/javase/downloads/index.html">
<img src="https://img.shields.io/badge/JDK-8+-green.svg" />
</a>
<a target="_blank" href="https://search.maven.org/search?q=g:%22com.github.xkzhangsan%22%20AND%20a:%22xk-time%22">
<img src="https://img.shields.io/maven-central/v/com.github.xkzhangsan/xk-time.svg?label=Maven%20Central" />
</a>
<a href="https://www.codacy.com/app/xkzhangsan/xk-time?utm_source=github.com&utm_medium=referral&utm_content=xkzhangsan/xk-time&utm_campaign=Badge_Grade">
<img src="https://api.codacy.com/project/badge/Grade/3e1b8a70248c46579b7b0d01d60c6377"/>
</a>
<a target="_blank" href="https://gitee.com/xkzhangsan/xk-time/stargazers">
<img src="https://gitee.com/xkzhangsan/xk-time/badge/star.svg?theme=dark" alt='gitee star'/>
</a>
<a target="_blank" href='https://github.com/xkzhangsan/xk-time'>
<img src="https://img.shields.io/github/stars/xkzhangsan/xk-time.svg?style=social" alt="github star"/>
</a>
</p>
<br>
### 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: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,如果节假日数据不支持年份,将使用周一到周五为工作日来判断。
详细使用可以查看相关测试代码。
### 3.日期格式化和解析工具类 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 H