当前位置: > > > SpringBoot - 实用工具类库common-util使用详解2(时间工具类:DateTimeUtil)

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,获取某月天数

(1)getCurrentMonthDays() 方法用于获取本月的天数,返回 int 类型:
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):该方法用于将传入时间戳重置到它的下一天的 00 0 秒,该方法重置时间返回 long 型的时间戳。
  • setToNextDay0H0M0SExceptToday(Timestamp stamp):该方法用于将传入 long 时间戳重置到它的下一天的 0 0 0 秒,当传入的时间今天则不进行重置。该方法重置时间后返回 long 型的时间戳。
  • setTimeToNextDay0H0M0S(long millis):该方法用于将传入 long 时间戳重置到它的下一天的 0 00 秒,该方法重置时间后返回 long 型的时间戳
  • setToNextDay0H0M0SExceptToday(long millis):该方法用于将传入 long 时间戳重置到它的下一天的 000 秒,当传入的时间今天则不进行重置。该方法重置时间后返回 long 型的时间戳。
  • setTimeTo0H0M0S(Timestamp time):该方法将时间戳重置到 000 秒,该方法重置时间后返回 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
评论0