SpringBoot - 实用工具类库common-util使用详解2(时间工具类:DateTimeUtil)
二、日期时间工具类(DateTimeUtil)
1,基本介绍
DateTimeUtil 是对时间转换操作的统一封装,首先其内部定义一些常用的时间格式表达式,具体如下:
public static final String DATE_FORMAT_MINITE = "yyyy-MM-dd HH:mm"; public static final String DATE_FORMAT_DAY = "yyyy-MM-dd"; public static final String DATE_FORMAT_SECOND = "yyyy-MM-dd HH:mm:ss"; public static final String DATE_FORMAT_SECOND_12 = "yyyy-MM-dd hh:mm:ss"; public static final String DATE_FORMAT_MILLISECOND = "yyyy-MM-dd HH:mm:ss.SSS"; public static final String DATE_FORMAT_CHINESE = "yyyy年MM月dd日"; public static final String DATE_FORMAT_CHINESE_SECONDE = "yyyy年MM月dd日 HH:mm:ss"; public static final String DATE_FORMAT_CHINESE_WEEK_SECONDE = "yyyy年MM月dd日 E HH:mm:ss"; public static final String YYYYMMDD = "yyyyMMdd"; public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static final String YYYYMMDDHHMMSSSSS = "yyyyMMddHHmmssSSS"; public static final long DAY_MS = 86400000L; private final static String[] WEEK_ARR = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};
2,获取当前时间
(1)getNowTime() 方法返回当前 long 类型的毫秒时间戳:
long now = DateTimeUtil.getNowTime(); // 1587112759766
(2)nowTimeStamp() 方法用于获取当前 Timestamp 时间戳(Timestamp 是 Date 的子类)
Timestamp now = DateTimeUtil.nowTimeStamp(); // 2020-04-17 16:41:22.161
(3)nowStrTime() 方法可以获取当前时间字符串(可以指定格式,如果不指定的话则默认为 "yyyy-MM-dd HH:mm:ss" 形式)
String str1 = DateTimeUtil.nowStrTime(); // 2020-04-17 14:31:01 String str2 = DateTimeUtil.nowStrTime(DateTimeUtil.DATE_FORMAT_DAY); // 2020-04-17
3,Date 转 String(dateToStr)
使用 dateToStr 方法可以将指定 Date 转化成指定格式的字符串时间:
String str = DateTimeUtil.dateToStr(new Date(), DateTimeUtil.DATE_FORMAT_SECOND); System.out.println(str);
4,String 转 Date(strToDate)
strToDate 方法用于将字符串时间转化成 Date。
注意:不知为何从 1.7.1 版本开始,转换时字符串“时分秒”部分都会变成 00:00:00(年月日正常),如最新版本还未修正,建议改用 1.7 版本。
Date date = DateTimeUtil.strToDate("2020-04-17 14:22:10", DateTimeUtil.DATE_FORMAT_SECOND);
5,毫秒时间(Long)与 String 相互转换
(1)long2Str 方法可以将毫秒时间格式化为字符串时间(如果不指定格式则默认使用“yyyy年MM月dd日”形式)。
long now = DateTimeUtil.getNowTime(); String str1 = DateTimeUtil.long2Str(now); // 2020年04月17日 String str2 = DateTimeUtil.long2Str(now, DateTimeUtil.DATE_FORMAT_SECOND); //2020-04-17 15:47:57
(2)strToLong 方法可以将字符串格式的时间转化成 long 型的时间戳:
long date = DateTimeUtil.strToLong(DateTimeUtil.DATE_FORMAT_SECOND,"2020-04-17 14:22:10"); //1587104530000
6,计算两个日期相差天数(getDistanceOfTwoDate)
注意:计算结果向下取整,比如实际相差 1.5 天会返回 1。
Date date1 = DateTimeUtil.strToDate("2020-04-17 14:22:10", DateTimeUtil.DATE_FORMAT_SECOND); Date date2 = DateTimeUtil.strToDate("2020-04-19 13:11:10", DateTimeUtil.DATE_FORMAT_SECOND); long distance = DateTimeUtil.getDistanceOfTwoDate(date1, date2); // 1
7,判断是否是闰年(isLeapYear)
DateTimeUtil.isLeapYear(2000); // true
8,判断是否不是同一天(isDifferentDay)
isDifferentDay() 方法用于判断传入的两个时间是否是不同天,如果不是同一天返回 true,如果是同一天则返回 false。- isDifferentDay(Calendar calendar1, Calendar calendar2) 方法用于判断传入的两个 Calendar 是否不是同一天
- isDifferentDay(Timestamp timestamp0, Timestamp timestamp1) 方法用于判断传入的两个时间戳是否不是同一天
long now = DateTimeUtil.getNowTime(); long nextDay = DateTimeUtil.setTimeToNextDay0H0M0S(now); // 明天的00:00:00 Boolean isDifferent1 = DateTimeUtil.isDifferentDay(now, nextDay); // true Boolean isDifferent2 = DateTimeUtil.isDifferentDay(now, nextDay-1); // false
9,获取某月天数
int num = DateTimeUtil.getCurrentMonthDays(); // 30
(2)getCurrentMonthDays(Timestamp stamp) 方法用于获取传入时间所在月份的天数,返回 int 类型:
int num = DateTimeUtil.getCurrentMonthDays(DateTimeUtil.nowTimeStamp()); // 30
10,获取第一天、最后一天
- getFirstDayOfCurrentWeek(Timestamp stamp) 方法根据传入时间获取所属周的第一天(0HOMOS)根据中国习惯将星期一当做第一天。
- getFirstDayOfCurrentWeek(long ms) 方法根据传入时间获取所属周的第一天(0HOMOS)根据中国习惯将星期一当做第一天。
- getLastDayOfCurrentWeek(Timestamp stamp) 方法根据时间获取所属周的最后一天,星期天(中国习惯),返回 long 型时间戳
- getFirstDayOfCurrentQuarter(long ms) 方法根据时间的得到所对应季度的第一天(0H0M0S),返回 long 型时间戳
- getFirstDayOfNextQuarter(long ms) 方法根据时间获取下一个季度的第一天(0H0M0S),返回 long 型时间戳
long now = DateTimeUtil.getNowTime(); // 1587114101560 long next = DateTimeUtil.getFirstDayOfNextQuarter(now); // 1593532800000 System.out.println(DateTimeUtil.long2Str(now, DateTimeUtil.DATE_FORMAT_SECOND)); // 2020-04-17 17:00:53 System.out.println(DateTimeUtil.long2Str(next, DateTimeUtil.DATE_FORMAT_SECOND)); // 2020-07-01 00:00:00
11,将时间戳重置到 0 时 0 分 0 秒
具体方法如下,它们的使用场景为需要精确根据时间范围来查找数据。比如在高并发昼夜高频使用的系统中,如果将时间重置到 23:59:59 来查询并不是可行方法,因为每一毫秒都可能有数据写入。
- setTimeToNextDay0H0M0S(Timestamp time):该方法用于将传入时间戳重置到它的下一天的 0 时 0 分 0 秒,该方法重置时间返回 long 型的时间戳。
- setToNextDay0H0M0SExceptToday(Timestamp stamp):该方法用于将传入 long 时间戳重置到它的下一天的 0 时 0 分 0 秒,当传入的时间今天则不进行重置。该方法重置时间后返回 long 型的时间戳。
- setTimeToNextDay0H0M0S(long millis):该方法用于将传入 long 时间戳重置到它的下一天的 0 时 0 分 0 秒,该方法重置时间后返回 long 型的时间戳
- setToNextDay0H0M0SExceptToday(long millis):该方法用于将传入 long 时间戳重置到它的下一天的 0 时 0 分 0 秒,当传入的时间今天则不进行重置。该方法重置时间后返回 long 型的时间戳。
- setTimeTo0H0M0S(Timestamp time):该方法将时间戳重置到 0 时 0 分 0 秒,该方法重置时间后返回 long 型的时间戳
- setTimeTo0H0M0S(long millis):该方法将 long 型的时间戳重置到 0 时 0 分 0 秒,该方法重置时间后返回 long 型的时间戳
- setTimeToLastDay0H0M0S(Timestamp time):该方法用于将时间戳重置到它的上一天 0 时 0 分 0 秒,该方法重置时间后返回 long 型的时间戳
- setToFirstDayOfCurrentYear(long millis):该方法将时间设置为当年第一天,并且将时分秒全部置 0
- setToFirstDayOfNextYear(long millis):该方法将时间设置为下一年的第一天,返回 long 型时间戳
- setToFirstDayOfCurrentMonth(long millis):该方法将时间重置为传入时间当前月的第一天,并且将时分秒全置 0,返回 long 型时间戳
- setToFirstDayOfLastMonth(long millis):该方法将时间重置到上月的第一天,返回 long 型时间戳
- setToFirstDayOfNextMonth(long millis):该方法方法将时间重置为传入时间下月的第一天,并将时分秒全置 0,返回 long 型时间戳
long begin = DateTimeUtil.setTimeTo0H0M0S(DateTimeUtil.nowTimeStamp()); long end = DateTimeUtil.setTimeToNextDay0H0M0S(DateTimeUtil.nowTimeStamp()); System.out.println(end-begin); // 86400000 (一天86400000毫秒)
12,获取同期时间
- setToLastMonthCommonDay(long ms) 方法根据 long 型时间戳获取上月同期的时间戳,返回 long 型时间戳。如果传入的时间是月末,处理后仍然是月末(例如:5 月 31 号,上月同期是 4 月 30 号)
- setToLastYearCommonDay(long millis) 方法根据传入的时间戳获取去年同期的时间戳,返回 long 型时间戳
- setToNextYearCommonDay(long millis) 方法根据时间获取下一年的同一天,返回 long 型时间戳
long now = DateTimeUtil.getNowTime(); // 1587115155141 long before = DateTimeUtil.setToLastMonthCommonDay(now); // 1584436755141 DateTimeUtil.long2Str(now, DateTimeUtil.DATE_FORMAT_SECOND); // 2020-04-17 17:19:15 DateTimeUtil.long2Str(before, DateTimeUtil.DATE_FORMAT_SECOND); // 2020-03-17 17:19:15
13,根据时间获取是周几(getDayOfWeek)
getDayOfWeek 方法可以知道传入时间是周几,根据中国习惯将星期一当做第一天:long now = DateTimeUtil.getNowTime(); long day = DateTimeUtil.getDayOfWeek(now); // 6 (表示周六)
14,判断是否是今天、今年
isToday 方法可以判断传入时间是否是今天,isCurrentYear 方法可以判断传入时间是否是今年。long now = DateTimeUtil.getNowTime(); Boolean isToday = DateTimeUtil.isToday(now); // true Boolean isCurrentYear = DateTimeUtil.isCurrentYear(now); // true
15,社交化友好时间显示(friendlyTime)
目前 friendlyTime 方法可以根据传入的时间返回这几种格式的字符串:xx 分钟前、xx 小时前、昨天、前天、xx 天前、xx 年 xx 月 xx 日(距今超过 10 天的话)。
long now = DateTimeUtil.getNowTime(); long yesterday = now - DateTimeUtil.DAY_MS * 1; long lastWeek = now - DateTimeUtil.DAY_MS * 7; long lastMonth = now - DateTimeUtil.DAY_MS * 30; String nowStr = DateTimeUtil.friendlyTime(now); // 1分钟前 String yesterdayStr = DateTimeUtil.friendlyTime(yesterday); // 昨天 String lastWeekStr = DateTimeUtil.friendlyTime(lastWeek); // 7天前 String lastMonthStr = DateTimeUtil.friendlyTime(lastMonth); // 2020年03月19日
16,计算年龄(getAge)
getAge 方法可以根据传入的出生日期计算出现在的年龄:
Date birthDay1 = DateTimeUtil.strToDate("2000-04-17", DateTimeUtil.DATE_FORMAT_DAY); Date birthDay2 = DateTimeUtil.strToDate("2000-05-17", DateTimeUtil.DATE_FORMAT_DAY); int age1 = DateTimeUtil.getAge(birthDay1.getTime()); //20 int age2 = DateTimeUtil.getAge(birthDay2.getTime()); //19
17,从身份证号中提取生日(getBirthdayFormIdCard)
Timestamp birth = DateTimeUtil.getBirthdayFormIdCard("456227202009190017"); //2020-09-19 00:00:00.0