SpringBoot - 实用工具类库common-util使用详解2

小灰灰 2020-04-22 10:09 2146阅读 0赞

日期时间工具类(DateTimeUtil)

1,基本介绍

DateTimeUtil 是对时间转换操作的统一封装,首先其内部定义一些常用的时间格式表达式,具体如下:

  1. public static final String DATE_FORMAT_MINITE = "yyyy-MM-dd HH:mm";
  2. public static final String DATE_FORMAT_DAY = "yyyy-MM-dd";
  3. public static final String DATE_FORMAT_SECOND = "yyyy-MM-dd HH:mm:ss";
  4. public static final String DATE_FORMAT_SECOND_12 = "yyyy-MM-dd hh:mm:ss";
  5. public static final String DATE_FORMAT_MILLISECOND = "yyyy-MM-dd HH:mm:ss.SSS";
  6. public static final String DATE_FORMAT_CHINESE = "yyyy年MM月dd日";
  7. public static final String DATE_FORMAT_CHINESE_SECONDE = "yyyy年MM月dd日 HH:mm:ss";
  8. public static final String DATE_FORMAT_CHINESE_WEEK_SECONDE = "yyyy年MM月dd日 E HH:mm:ss";
  9. public static final String YYYYMMDD = "yyyyMMdd";
  10. public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
  11. public static final String YYYYMMDDHHMMSSSSS = "yyyyMMddHHmmssSSS";
  12. public static final long DAY_MS = 86400000L;
  13. private final static String[] WEEK_ARR = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};

2,获取当前时间

(1)getNowTime() 方法返回当前 long 类型的毫秒时间戳:

  1. long now = DateTimeUtil.getNowTime(); // 1587112759766

(2)nowTimeStamp() 方法用于获取当前 Timestamp 时间戳(TimestampDate 的子类)

  1. Timestamp now = DateTimeUtil.nowTimeStamp(); // 2020-04-17 16:41:22.161

(3)nowStrTime() 方法可以获取当前时间字符串(可以指定格式,如果不指定的话则默认为 “yyyy-MM-dd HH: mm:ss“ 形式)

  1. String str1 = DateTimeUtil.nowStrTime(); // 2020-04-17 14:31:01
  2. String str2 = DateTimeUtil.nowStrTime(DateTimeUtil.DATE_FORMAT_DAY); // 2020-04-17

3,Date 转 String(dateToStr)

使用 dateToStr 方法可以将指定 Date 转化成指定格式的字符串时间:

  1. String str = DateTimeUtil.dateToStr(new Date(), DateTimeUtil.DATE_FORMAT_SECOND);
  2. System.out.println(str);

原文:SpringBoot - 实用工具类库common-util使用详解2(时间工具类:DateTimeUtil

4,String 转 Date(strToDate)

strToDate 方法用于将字符串时间转化成 Date

注意:不知为何从 1.7.1 版本开始,转换时字符串“时分秒”部分都会变成 00:00:00(年月日正常),如最新版本还未修正,建议改用 1.7 版本。

  1. Date date = DateTimeUtil.strToDate("2020-04-17 14:22:10", DateTimeUtil.DATE_FORMAT_SECOND);

5,毫秒时间(Long)与 String 相互转换

(1)long2Str 方法可以将毫秒时间格式化为字符串时间(如果不指定格式则默认使用“yyyy年MM月dd日”形式)。

  1. long now = DateTimeUtil.getNowTime();
  2. String str1 = DateTimeUtil.long2Str(now); // 2020年04月17日
  3. String str2 = DateTimeUtil.long2Str(now, DateTimeUtil.DATE_FORMAT_SECOND); //2020-04-17 15:47:57

(2)strToLong 方法可以将字符串格式的时间转化成 long 型的时间戳:

  1. long date = DateTimeUtil.strToLong(DateTimeUtil.DATE_FORMAT_SECOND,"2020-04-17 14:22:10"); //1587104530000

6,计算两个日期相差天数(getDistanceOfTwoDate)

注意:计算结果向下取整,比如实际相差 1.5 天会返回 1

  1. Date date1 = DateTimeUtil.strToDate("2020-04-17 14:22:10", DateTimeUtil.DATE_FORMAT_SECOND);
  2. Date date2 = DateTimeUtil.strToDate("2020-04-19 13:11:10", DateTimeUtil.DATE_FORMAT_SECOND);
  3. long distance = DateTimeUtil.getDistanceOfTwoDate(date1, date2); // 1

7,判断是否是闰年(isLeapYear)

  1. DateTimeUtil.isLeapYear(2000); // true

8,判断是否不是同一天(isDifferentDay)

isDifferentDay() 方法用于判断传入的两个时间是否是不同天,如果不是同一天返回 true,如果是同一天则返回 false

  • isDifferentDay(Calendar calendar1, Calendar calendar2) 方法用于判断传入的两个 Calendar 是否不是同一天
  • isDifferentDay(Timestamp timestamp0, Timestamp timestamp1) 方法用于判断传入的两个时间戳是否不是同一天
  1. long now = DateTimeUtil.getNowTime();
  2. long nextDay = DateTimeUtil.setTimeToNextDay0H0M0S(now); // 明天的00:00:00
  3. Boolean isDifferent1 = DateTimeUtil.isDifferentDay(now, nextDay); // true
  4. Boolean isDifferent2 = DateTimeUtil.isDifferentDay(now, nextDay-1); // false

9,获取某月天数

(1)getCurrentMonthDays() 方法用于获取本月的天数,返回 int 类型:

  1. int num = DateTimeUtil.getCurrentMonthDays(); // 30

(2)getCurrentMonthDays(Timestamp stamp) 方法用于获取传入时间所在月份的天数,返回 int 类型:

  1. 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 型时间戳
  1. long now = DateTimeUtil.getNowTime(); // 1587114101560
  2. long next = DateTimeUtil.getFirstDayOfNextQuarter(now); // 1593532800000
  3. System.out.println(DateTimeUtil.long2Str(now, DateTimeUtil.DATE_FORMAT_SECOND)); // 2020-04-17 17:00:53
  4. 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):该方法用于将传入时间戳重置到它的下一天的 000 秒,该方法重置时间返回 long 型的时间戳。
  • setToNextDay0H0M0SExceptToday(Timestamp stamp):该方法用于将传入 long 时间戳重置到它的下一天的 000 秒,当传入的时间今天则不进行重置。该方法重置时间后返回 long 型的时间戳。
  • setTimeToNextDay0H0M0S(long millis):该方法用于将传入 long 时间戳重置到它的下一天的 000 秒,该方法重置时间后返回 long 型的时间戳
  • setToNextDay0H0M0SExceptToday(long millis):该方法用于将传入 long 时间戳重置到它的下一天的 000 秒,当传入的时间今天则不进行重置。该方法重置时间后返回 long 型的时间戳。
  • setTimeTo0H0M0S(Timestamp time):该方法将时间戳重置到 000 秒,该方法重置时间后返回 long 型的时间戳
  • setTimeTo0H0M0S(long millis):该方法将 long 型的时间戳重置到 000 秒,该方法重置时间后返回 long 型的时间戳
  • setTimeToLastDay0H0M0S(Timestamp time):该方法用于将时间戳重置到它的上一天 000 秒,该方法重置时间后返回 long 型的时间戳
  • setToFirstDayOfCurrentYear(long millis):该方法将时间设置为当年第一天,并且将时分秒全部置 0
  • setToFirstDayOfNextYear(long millis):该方法将时间设置为下一年的第一天,返回 long 型时间戳
  • setToFirstDayOfCurrentMonth(long millis):该方法将时间重置为传入时间当前月的第一天,并且将时分秒全置 0,返回 long 型时间戳
  • setToFirstDayOfLastMonth(long millis):该方法将时间重置到上月的第一天,返回 long 型时间戳
  • setToFirstDayOfNextMonth(long millis):该方法方法将时间重置为传入时间下月的第一天,并将时分秒全置 0,返回 long 型时间戳
  1. long begin = DateTimeUtil.setTimeTo0H0M0S(DateTimeUtil.nowTimeStamp());
  2. long end = DateTimeUtil.setTimeToNextDay0H0M0S(DateTimeUtil.nowTimeStamp());
  3. System.out.println(end-begin); // 86400000 (一天86400000毫秒)

12,获取同期时间

  • setToLastMonthCommonDay(long ms) 方法根据 long 型时间戳获取上月同期的时间戳,返回 long 型时间戳。如果传入的时间是月末,处理后仍然是月末(例如:531 号,上月同期是 430 号)
  • setToLastYearCommonDay(long millis) 方法根据传入的时间戳获取去年同期的时间戳,返回 long 型时间戳
  • setToNextYearCommonDay(long millis) 方法根据时间获取下一年的同一天,返回 long 型时间戳
  1. long now = DateTimeUtil.getNowTime(); // 1587115155141
  2. long before = DateTimeUtil.setToLastMonthCommonDay(now); // 1584436755141
  3. DateTimeUtil.long2Str(now, DateTimeUtil.DATE_FORMAT_SECOND); // 2020-04-17 17:19:15
  4. DateTimeUtil.long2Str(before, DateTimeUtil.DATE_FORMAT_SECOND); // 2020-03-17 17:19:15

13,根据时间获取是周几(getDayOfWeek)

getDayOfWeek 方法可以知道传入时间是周几,根据中国习惯将星期一当做第一天:

  1. long now = DateTimeUtil.getNowTime();
  2. long day = DateTimeUtil.getDayOfWeek(now); // 6 (表示周六)

14,判断是否是今天、今年

isToday 方法可以判断传入时间是否是今天,isCurrentYear 方法可以判断传入时间是否是今年。

  1. long now = DateTimeUtil.getNowTime();
  2. Boolean isToday = DateTimeUtil.isToday(now); // true
  3. Boolean isCurrentYear = DateTimeUtil.isCurrentYear(now); // true

15,社交化友好时间显示(friendlyTime)

目前 friendlyTime 方法可以根据传入的时间返回这几种格式的字符串:xx 分钟前、xx 小时前、昨天、前天、xx 天前、xxxxxx 日(距今超过 10 天的话)。

  1. long now = DateTimeUtil.getNowTime();
  2. long yesterday = now - DateTimeUtil.DAY_MS * 1;
  3. long lastWeek = now - DateTimeUtil.DAY_MS * 7;
  4. long lastMonth = now - DateTimeUtil.DAY_MS * 30;
  5. String nowStr = DateTimeUtil.friendlyTime(now); // 1分钟前
  6. String yesterdayStr = DateTimeUtil.friendlyTime(yesterday); // 昨天
  7. String lastWeekStr = DateTimeUtil.friendlyTime(lastWeek); // 7天前
  8. String lastMonthStr = DateTimeUtil.friendlyTime(lastMonth); // 2020年03月19日

16,计算年龄(getAge)

getAge 方法可以根据传入的出生日期计算出现在的年龄:

  1. Date birthDay1 = DateTimeUtil.strToDate("2000-04-17", DateTimeUtil.DATE_FORMAT_DAY);
  2. Date birthDay2 = DateTimeUtil.strToDate("2000-05-17", DateTimeUtil.DATE_FORMAT_DAY);
  3. int age1 = DateTimeUtil.getAge(birthDay1.getTime()); //20
  4. int age2 = DateTimeUtil.getAge(birthDay2.getTime()); //19

17,从身份证号中提取生日(getBirthdayFormIdCard)

  1. Timestamp birth = DateTimeUtil.getBirthdayFormIdCard("456227202009190017"); //2020-09-19 00:00:00.0

发表评论

表情:
评论列表 (有 0 条评论,2146人围观)

还没有评论,来说两句吧...

相关阅读

    相关 实用工具

    第一个:SharedPreferences: 在使用这个工具类的时候我遇到两个坑: 第一个坑、有一个getValue的方法中用到了下面的代码导致将数据清除,导致我存储