Java常见的时间处理

292 阅读12分钟
在日常开发中我们总会遇到一些时间上的处理需求,那么本篇文章就来总结一下常见的处理方法和工具类的使用方法

一、LocalDateTime类型时间的处理

1.获取当前时间

LocalDateTime nowTime = LocalDateTime.now();
//结果:2021-02-20T09:45:44.527
System.out.println(nowTime);

2.获取年月日

//【方法1】
String a = LocalDateTime.now().format(DateTimeFormatter.ISO_DATE);
//结果:2021-02-20
System.out.println(a);
//【方法2】
String b = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//结果:2021-02-20
System.out.println(b);

3.获取时分秒

String c = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"));
//结果:09:45:44
System.out.println(c);

4.获取年月日时分秒毫秒

String d = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS"));
//结果:2021-02-20 09:45:44:527
System.out.println(d);

5.获取秒数

Long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
//结果:1613785755
System.out.println(second);

6.获取毫秒数

Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
//结果:1613785815633
System.out.println(milliSecond);

7.毫秒转LocalDateTime

Long longTime = 1613786449976L;
LocalDateTime ldt = Instant.ofEpochMilli(longTime).atZone(ZoneId.systemDefault()).toLocalDateTime();
//结果:2021-02-20T10:00:49.976
System.out.println(ldt);

8.String转LocalDateTime

String dateTimeStr = "2021-02-20 09:50:15";
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, df);
//结果:2021-02-20T09:50:15
System.out.println(dateTime);

9.LocalDateTime转String

//除了下面的方法之外,上面类型转换的都可以看成是LocalDateTime转String  ZoneOffset.of("+8")意思为:默认时区为东8区
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dateTime2 = LocalDateTime.now(ZoneOffset.of("+8")).format(formatter);
//结果:2021-02-20 09:55:52
System.out.println(dateTime2);

10.LocalDateTime转Date

Date date = new Date();
LocalDateTime localDateTime = date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime();
//结果:2021-02-20T09:59:14.719
System.out.println(localDateTime);

11.Date转LocalDateTime

LocalDateTime localDateTime1 = LocalDateTime.now();
Date date1 = Date.from(localDateTime1.toInstant(ZoneOffset.of("+8")));
//结果:Sat Feb 20 10:00:49 CST 2021
System.out.println(date1);

12.LocalDateTime获取年

System.out.println("当前时间为:"+LocalDateTime.now()+" == "+"2021-02-20T10:23:45.041");
int year = LocalDateTime.now().getYear();
//结果:2021
System.out.println(year);

13.LocalDateTime获取月

Month month = LocalDateTime.now().getMonth();
//结果:FEBRUARY
System.out.println(month);
int monthValue = LocalDateTime.now().getMonthValue();
//结果:2
System.out.println(monthValue);

14.LocalDateTime获取日

int dayOfMonth = LocalDateTime.now().getDayOfMonth();
//结果:20
System.out.println(dayOfMonth);
DayOfWeek dayOfWeek = LocalDateTime.now().getDayOfWeek();
//结果:SATURDAY
System.out.println(dayOfWeek);
int dayOfYear = LocalDateTime.now().getDayOfYear();
//结果:51
System.out.println(dayOfYear);

15.LocalDateTime获取时

int hour = LocalDateTime.now().getHour();
//结果:10
System.out.println(hour);

16.LocalDateTime获取分

int minute = LocalDateTime.now().getMinute();
//结果:23
System.out.println(minute);

17.LocalDateTime获取秒

int second1 = LocalDateTime.now().getSecond();
//结果:45
System.out.println(second1);

18.LocalDateTime获取特定日期

LocalDateTime of = LocalDateTime.of(2021, 2, 20, 10, 37, 20);
//结果:2021-02-20T10:37:20
System.out.println(of);

19.LocalDateTime时间对比

LocalDateTime of1 = LocalDateTime.of(2021, 2, 20, 10, 37, 20);
LocalDateTime of2 = LocalDateTime.of(2021, 2, 20, 10, 37, 22);
LocalDateTime of3 = LocalDateTime.of(2021, 2, 20, 10, 37, 22);
//【方法1】
//结果:false
System.out.println(of1.equals(of2));
//结果:true
System.out.println(of2.equals(of3));
//结果:-1 of1 < of2
System.out.println(of1.compareTo(of2));
//结果:0 of2 = of3
System.out.println(of2.compareTo(of3));
//结果:1 of3 > of1
System.out.println(of3.compareTo(of1));
//【方法2】
//结果:false
System.out.println(of1.isAfter(of2));
//结果:true
System.out.println(of1.isBefore(of2));
//结果:true
System.out.println(of2.isEqual(of3));

20.LocalDateTime获取一天前/后日期

LocalDateTime localDateTime2 = LocalDateTime.now().plusDays(1);
//结果:2021-02-21T10:48:26.911
System.out.println(localDateTime2);
LocalDateTime localDateTime3 = LocalDateTime.now().plusDays(-1);
//结果:2021-02-19T10:48:26.911
System.out.println(localDateTime3);

21.LocalDateTime获取一小时前/后日期

LocalDateTime localDateTime4 = LocalDateTime.now().plusHours(1);
//结果:2021-02-20T11:49:32.320
System.out.println(localDateTime4);
LocalDateTime localDateTime5 = LocalDateTime.now().plusHours(-1);
//结果:2021-02-20T09:49:32.320
System.out.println(localDateTime5);

22.LocalDateTime获取一年前/后日期

LocalDateTime localDateTime6 = LocalDateTime.now().plusYears(1);
//结果:2022-02-20T10:51:47.585
System.out.println(localDateTime6);
LocalDateTime localDateTime7 = LocalDateTime.now().plusYears(-1);
//结果:2020-02-20T10:51:47.585
System.out.println(localDateTime7);

23.LocalDateTime获取一分钟前/后日期

LocalDateTime localDateTime8 = LocalDateTime.now().plusMinutes(1);
//结果:2021-02-20T13:54:39.209
System.out.println(localDateTime8);
LocalDateTime localDateTime9 = LocalDateTime.now().plusMinutes(-1);
//结果:2021-02-20T13:52:39.209
System.out.println(localDateTime9);

24.LocalDateTime获取一月前/后日期

LocalDateTime localDateTime10 = LocalDateTime.now().plusMonths(1);
//结果:2021-03-20T13:55:12.718
System.out.println(localDateTime10);
LocalDateTime localDateTime11 = LocalDateTime.now().plusMonths(-1);
//结果:2021-01-20T13:55:12.718
System.out.println(localDateTime11);

25.LocalDateTime获取一秒前/后日期

LocalDateTime localDateTime12 = LocalDateTime.now().plusSeconds(1);
//结果:2021-02-20T13:57:51.966
System.out.println(localDateTime12);
LocalDateTime localDateTime13 = LocalDateTime.now().plusSeconds(-1);
//结果:2021-02-20T13:57:49.966
System.out.println(localDateTime13);

26.LocalDateTime获取一周前/后日期

LocalDateTime localDateTime14 = LocalDateTime.now().plusWeeks(1);
//结果:2021-02-27T13:59:46.615
System.out.println(localDateTime14);
LocalDateTime localDateTime15 = LocalDateTime.now().plusWeeks(-1);
//结果:2021-02-13T13:59:46.615
System.out.println(localDateTime15);

二、Date类型时间的处理

<!-- 这里推荐使用hutool包里的DateUtil工具类 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.7</version>
</dependency>

1.获取当前时间 年月日时分秒

public static void main(String[] args) {
    Date date = DateUtil.date();
    System.out.println(date);//2022-02-23 10:53:04
    Date date2 = DateUtil.date(Calendar.getInstance());
    System.out.println(date2);//2022-02-23 10:53:04
    Date date3 = DateUtil.date(System.currentTimeMillis());
    System.out.println(date3);//2022-02-23 10:53:04
    String date4 = DateUtil.now();
    System.out.println(date4);//2022-02-23 10:53:04
}

2.获取 年月日

String date= DateUtil.today();
System.out.println(date);//2022-02-23

3.获取 时分秒

public static void main(String[] args) {
    String format = DateUtil.format(DateUtil.date(), "HH:mm:ss");
    System.out.println(format);//15:31:09
}

4.获取 年

int year = DateUtil.year(DateUtil.date());
System.out.println(year);//2022

5.获取 月

public static void main(String[] args) {
    System.out.println(DateUtil.date());//2022-02-23 11:30:27
    int month = DateUtil.month(DateUtil.date());
    System.out.println(month);//1 获得月份,从0开始计数,这里要注意 
    Month months = DateUtil.monthEnum(DateUtil.date());
    System.out.println(months.name());//FEBRUARY
    System.out.println(months.getValue());//1 从0开始算
}

6.获取 日

int day = DateUtil.dayOfMonth(DateUtil.date());
System.out.println(day);//23

7.获取 时

int hour1 = DateUtil.hour(DateUtil.date(), true);
System.out.println(hour1);//18 true意思为按照24小时计算
int hour2 = DateUtil.hour(DateUtil.date(), false);
System.out.println(hour2);//6 false意思为按照12小时计算

8.获取 分

int minute = DateUtil.minute(DateUtil.date());
System.out.println(minute);//19

9.获取 秒

int second = DateUtil.second(DateUtil.date());
System.out.println(second);//54

10.获取 每天的开始时间和结束时间

public static void main(String[] args) {
    DateTime beginOfDayTime = DateUtil.beginOfDay(DateUtil.date());
    System.out.println(beginOfDayTime);//2022-02-23 00:00:00
    DateTime endOfDayTime = DateUtil.endOfDay(DateUtil.date());
    System.out.println(endOfDayTime);//2022-02-23 23:59:59
}

11.获取 每个月的开始时间和结束时间

public static void main(String[] args) {
    DateTime beginOfMonthTime = DateUtil.beginOfMonth(DateUtil.date());
    System.out.println(beginOfMonthTime);//2022-02-01 00:00:00
    DateTime endOfMonthTime = DateUtil.endOfMonth(DateUtil.date());
    System.out.println(endOfMonthTime);//2022-02-28 23:59:59
}

12.获取 每年的开始时间和结束时间

public static void main(String[] args) {
    DateTime beginOfYearTime = DateUtil.beginOfYear(DateUtil.date());
    System.out.println(beginOfYearTime);//2022-01-01 00:00:00
    DateTime endOfYearTime = DateUtil.endOfYear(DateUtil.date());
    System.out.println(endOfYearTime);//2022-12-31 23:59:59
}

13.获取 昨天-明天-上周-下周-上月-下月

public static void main(String[] args) {
    System.out.println(DateUtil.date());//2022-02-23 11:41:43
    DateTime yesterday = DateUtil.yesterday();
    System.out.println(yesterday);//昨天 2022-02-22 11:41:43
    DateTime tomorrow = DateUtil.tomorrow();
    System.out.println(tomorrow);//明天 2022-02-24 11:41:43
    DateTime lastWeek = DateUtil.lastWeek();
    System.out.println(lastWeek);//上周 2022-02-16 11:41:43
    DateTime nextWeek = DateUtil.nextWeek();
    System.out.println(nextWeek);//下周 2022-03-02 11:41:43
    DateTime lastMonth = DateUtil.lastMonth();
    System.out.println(lastMonth);//上月 2022-01-23 11:41:43
    DateTime nextMonth = DateUtil.nextMonth();
    System.out.println(nextMonth);//下月 2022-03-23 11:41:43
}

14.获取 星座和属相

public static void main(String[] args) {
    String zodiac = DateUtil.getZodiac(Month.JANUARY.getValue(), 19);
    System.out.println(zodiac);// "摩羯座"
    String chineseZodiac = DateUtil.getChineseZodiac(1994);
    System.out.println(chineseZodiac);// "狗"
}

15.获取 年龄

public static void main(String[] args) {
    System.out.println(DateUtil.date());//2022-02-23 13:46:56
    int age = DateUtil.ageOfNow("1994-01-01");
    System.out.println(age);//28
    int age1 = DateUtil.ageOfNow(DateUtil.date());
    System.out.println(age1);//0
}

16.获取 是否是闰年

public static void main(String[] args) {
    boolean isLeapYear = DateUtil.isLeapYear(2018);
    System.out.println(isLeapYear);//false
}

17.获取 当前日期的季度

public static void main(String[] args) {
    int quarter = DateUtil.quarter(DateUtil.date());
    System.out.println(quarter);
}

18.String转Date

public static void main(String[] args) {
    String dateStr1 = "2022-03-01 22:33:23";
    Date date = DateUtil.parse(dateStr1);
    System.out.println(date);//2022-03-01 22:33:23
    DateTime parse = DateUtil.parse(dateStr1, "yyyy-MM-dd");
    System.out.println(parse);//2022-03-01 00:00:00
}

19.Date转String

public static void main(String[] args) {
    DateTime date = DateUtil.date();
    String format = DateUtil.format(date, "yyyy-MM-dd");
    System.out.println(format);//2022-02-23
    String format1 = DateUtil.format(date, "yyyy/MM/dd");
    System.out.println(format1);//2022/02/23
    String dateStr = DateUtil.formatDate(date);
    System.out.println(dateStr);//2022-02-23
    String dateTimeStr = DateUtil.formatDateTime(date);
    System.out.println(dateTimeStr);//2022-02-23 14:07:02
    String timeStr = DateUtil.formatTime(date);
    System.out.println(timeStr);//14:07:02
}

20.获取 N天前后的时间

public static void main(String[] args) {
    Date date = DateUtil.parse("2022-03-01 22:33:23");
    DateTime timeAfter = DateUtil.offsetDay(date, 2);
    System.out.println(timeAfter);//2022-03-03 22:33:23
    DateTime timeBefore = DateUtil.offsetDay(date, -2);
    System.out.println(timeBefore);//2022-02-27 22:33:23
}

21.获取 N个月前后的时间

public static void main(String[] args) {
    Date date = DateUtil.parse("2022-03-01 22:33:23");
    DateTime timeAfter = DateUtil.offsetMonth(date, 2);
    System.out.println(timeAfter);//2022-05-01 22:33:23
    DateTime timeBefore = DateUtil.offsetMonth(date, -2);
    System.out.println(timeBefore);//2022-01-01 22:33:23
}

22.获取 N周前后的时间

public static void main(String[] args) {
    Date date = DateUtil.parse("2022-03-30 22:33:23");
    DateTime timeAfter = DateUtil.offsetWeek(date,1);
    System.out.println(timeAfter);//2022-04-06 22:33:23
    DateTime timeBefore = DateUtil.offsetWeek(date, -1);
    System.out.println(timeBefore);//2022-03-23 22:33:23
}

23.获取 N小时前后的时间

public static void main(String[] args) {
    Date date = DateUtil.parse("2022-03-30 22:33:23");
    DateTime timeAfter = DateUtil.offsetHour(date,1);
    System.out.println(timeAfter);//2022-03-30 23:33:23
    DateTime timeBefore = DateUtil.offsetHour(date, -1);
    System.out.println(timeBefore);//2022-03-30 21:33:23
}

24.获取 N分钟前后的时间

public static void main(String[] args) {
    Date date = DateUtil.parse("2022-03-30 22:33:23");
    DateTime timeAfter = DateUtil.offsetMinute(date,1);
    System.out.println(timeAfter);//2022-03-30 22:34:23
    DateTime timeBefore = DateUtil.offsetMinute(date, -1);
    System.out.println(timeBefore);//2022-03-30 22:32:23
}

25.获取 N秒前后的时间

public static void main(String[] args) {
    Date date = DateUtil.parse("2022-03-30 22:33:23");
    DateTime timeAfter = DateUtil.offsetSecond(date,1);
    System.out.println(timeAfter);//2022-03-30 22:33:24
    DateTime timeBefore = DateUtil.offsetSecond(date, -1);
    System.out.println(timeBefore);//2022-03-30 22:33:22
}

26.获取 N年前后的时间

public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.YEAR,-1);
    DateTime date = DateUtil.date(calendar);
    System.out.println(date);//2021-02-23 16:14:18
}

27.获取 两个时间相差的时间

public static void main(String[] args) {
    String dateStr1 = "2017-03-01 22:33:23";
    Date date1 = DateUtil.parse(dateStr1);

    String dateStr2 = "2017-04-01 23:33:23";
    Date date2 = DateUtil.parse(dateStr2);

    //相差xx毫秒
    long betweenMS = DateUtil.between(date1, date2, DateUnit.MS);
    System.out.println(betweenMS);//2682000000
    //相差xx秒
    long betweenSecond = DateUtil.between(date1, date2, DateUnit.SECOND);
    System.out.println(betweenSecond);//2682000
    //相差xx分钟
    long betweenMinute = DateUtil.between(date1, date2, DateUnit.MINUTE);
    System.out.println(betweenMinute);//44700
    //相差xx小时
    long betweenHour = DateUtil.between(date1, date2, DateUnit.HOUR);
    System.out.println(betweenHour);//745
    //相差xx天
    long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
    System.out.println(betweenDay);//31
    //相差xx周
    long betweenWeek = DateUtil.between(date1, date2, DateUnit.WEEK);
    System.out.println(betweenWeek);//4
}

28.获取 两个时间的大小

public static void main(String[] args) {
    String dateStr1 = "2017-03-01 22:33:23";
    Date date1 = DateUtil.parse(dateStr1);

    String dateStr2 = "2017-04-01 23:33:23";
    Date date2 = DateUtil.parse(dateStr2);

    int compare = DateUtil.compare(date1, date2);
    System.out.println(compare);//-1 可通过结果 >0 或者 <0来判断两个时间大小
}

29.获取 两个时间相差的天数

public static void main(String[] args) {
    String dateStr1 = "2017-03-01 22:33:23";
    Date date1 = DateUtil.parse(dateStr1);

    String dateStr2 = "2017-03-02 01:33:23";
    Date date2 = DateUtil.parse(dateStr2);

    long day1 = DateUtil.betweenDay(date1, date2,false);
    System.out.println(day1);//0 不足1天不算
    long day2 = DateUtil.betweenDay(date1, date2,true);
    System.out.println(day2);//1 不足1天算1天

}

30.获取 两个时间相差的月数

public static void main(String[] args) {
    String dateStr1 = "2017-03-01 22:33:23";
    Date date1 = DateUtil.parse(dateStr1);

    String dateStr2 = "2017-04-01 01:33:23";
    Date date2 = DateUtil.parse(dateStr2);

    long day1 = DateUtil.betweenMonth(date1, date2,false);
    System.out.println(day1);//0 不足1月不算
    long day2 = DateUtil.betweenMonth(date1, date2,true);
    System.out.println(day2);//1 不足1月算1月
}

31.获取 两个时间相差的年数

public static void main(String[] args) {
    String dateStr1 = "2017-03-01 22:33:23";
    Date date1 = DateUtil.parse(dateStr1);

    String dateStr2 = "2018-03-01 01:33:23";
    Date date2 = DateUtil.parse(dateStr2);

    long day1 = DateUtil.betweenYear(date1, date2,false);
    System.out.println(day1);//0 不足1年不算
    long day2 = DateUtil.betweenYear(date1, date2,true);
    System.out.println(day2);//1 不足1年算1年
}

32.获取 两个时间相差的小时数

public static void main(String[] args) {
    String dateStr1 = "2017-03-01 22:33:23";
    Date date1 = DateUtil.parse(dateStr1);

    String dateStr2 = "2017-03-01 23:33:22";
    Date date2 = DateUtil.parse(dateStr2);

    long day1 = DateUtil.between(date1, date2,DateUnit.HOUR);
    System.out.println(day1);//0 不足1小时的 不算
}

33.获取 两个时间相差的分钟数

public static void main(String[] args) {
    String dateStr1 = "2017-03-01 22:33:23";
    Date date1 = DateUtil.parse(dateStr1);

    String dateStr2 = "2017-03-01 22:32:24";
    Date date2 = DateUtil.parse(dateStr2);

    long day1 = DateUtil.between(date1, date2,DateUnit.MINUTE);
    System.out.println(day1);//0 不足1分钟的 不算
}

34.获取 两个时间相差的秒数

public static void main(String[] args) {
    String dateStr1 = "2017-03-01 22:33:23";
    Date date1 = DateUtil.parse(dateStr1);

    String dateStr2 = "2017-03-01 22:33:24";
    Date date2 = DateUtil.parse(dateStr2);

    long day1 = DateUtil.between(date1, date2,DateUnit.SECOND);
    System.out.println(day1);//1
}

35.获取 两个时间相差的毫秒数

public static void main(String[] args) {
    String dateStr1 = "2017-03-01 22:33:23";
    Date date1 = DateUtil.parse(dateStr1);

    String dateStr2 = "2017-03-01 22:33:24";
    Date date2 = DateUtil.parse(dateStr2);

    long day1 = DateUtil.between(date1, date2,DateUnit.MS);
    System.out.println(day1);//1000
}

36.获取 两个时间相差的时间(友好提示)

public static void main(String[] args) {
    String dateStr1 = "2017-03-01 22:33:23";
    Date date1 = DateUtil.parse(dateStr1);

    String dateStr2 = "2018-04-02 23:34:24";
    Date date2 = DateUtil.parse(dateStr2);

    String s1 = DateUtil.formatBetween(date1, date2);
    System.out.println(s1);//397天1小时1分1秒

    String s2 = DateUtil.formatBetween(1000);
    System.out.println(s2);//1秒
}

37.获取 今天是今年以来的第几周

public static void main(String[] args) {
    int i = DateUtil.thisWeekOfYear();
    System.out.println(i);//9
}

38.获取 年月日中文版

public static void main(String[] args) {
    String s = DateUtil.formatChineseDate(DateUtil.date(),true);
    System.out.println(s);//二〇二二年二月二十三日
    String s1 = DateUtil.formatChineseDate(DateUtil.date(),false);
    System.out.println(s1);//2022年02月23日
    String s2 = DateUtil.formatHttpDate(DateUtil.date());
    System.out.println(s2);//Wed, 23 Feb 2022 07:43:19 GMT
}

39.毫秒转时间

public static void main(String[] args) {
    DateTime date = DateUtil.date(1645602596000L);
    System.out.println(date);//2022-02-23 15:49:56
}

40.时间转毫秒

public static void main(String[] args) {
    long time = DateUtil.date().getTime();
    System.out.println(time);//1645603008554
}

41.判断当前时间是否在两个时间范围内

public static void main(String[] args) {
    boolean isIn = DateUtil.date().isIn(DateUtil.parse("2022-02-22 22:33:23"), DateUtil.parse("2022-02-24 22:33:23"));
    System.out.println(isIn);//true
}

42.判断当前时间是否大于/小于某个时间

public static void main(String[] args) {
    System.out.println(DateUtil.date());//2022-02-23 16:06:47
    boolean isBefore = DateUtil.date().isBefore(DateUtil.parse("2022-02-22 22:33:23"));
    System.out.println(isBefore);//false
    boolean isAfter = DateUtil.date().isAfter(DateUtil.parse("2022-02-22 22:33:23"));
    System.out.println(isAfter);//true
    boolean isBeforeEqual = DateUtil.date().isBeforeOrEquals(DateUtil.parse("2022-02-23"));
    System.out.println(isBeforeEqual);//false
    boolean isAfterEqual = DateUtil.date().isBeforeOrEquals(DateUtil.parse("2022-02-23"));
    System.out.println(isAfterEqual);//false
    boolean isAfterEquals = DateUtil.date().isBeforeOrEquals(DateUtil.date());
    System.out.println(isAfterEquals);//true
}