java优雅的处理日期时间,LocalDate、LocalTime、LocalDateTime使用

2022年11月18日12:57:20

前言

jdk8之前日期时间相关的操作大多用的是Date类或者Calendar类。

比如:

Date date=newDate();SimpleDateFormat df=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(df.format(date));//2020-09-22 09:19:44

Date类或者Calendar类的缺点:

  • 非线程安全 : java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java的日期类最大的问题之一。

  • 设计很差 :Java的日期时间类的定义并不一致,在 java.util 和 java.sql 的包中都有日期类,此外用于格式化和解析的类在 java.text 包中定义。java.util.Date 同时包含日期和时间,而 java.sql.Date 仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。

  • 时区处理麻烦 : 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar 和 java.util.TimeZone 类,但他们同样存在上述所有的问题。

jd8以后增加了LocalDateZoned,能更方便优雅的处理日期时间,本文主要介绍这两者。

一、LocalDate、LocalTime、LocalDateTime介绍

  • LocalDate:只包含年月日,不包含时分秒,当不需要具体的时间时可以使用LocalDate
  • LocalTime:只包含时分秒,不包含年月日,当不需要具体的日期时可以使用LocalTime
  • LocalDateTime:包含年月日时分秒,当日期和时间都需要使用时可以使用LocalDateTime

二、获取当前时间

  • LocalDate获取当前年、月、日
LocalDate nowdata=LocalDate.now();System.out.println(nowdata);//2021-04-06 获取当前年月日System.out.println(nowdata.getYear());//2021 获取当前年份System.out.println(nowdata.getMonth().getValue());//4 获取当前月份System.out.println(nowdata.getDayOfMonth());//6 获取今天几号System.out.println(nowdata.getDayOfWeek().getValue());//2 获取今天星期几System.out.println(nowdata.getDayOfYear());//96 获取今天是今年的第几天
  • LocalTime获取当前时、分、秒
LocalTime nowTime=LocalTime.now();System.out.println(nowTime);//09:51:11.987 获取当前的时间System.out.println(nowTime.getHour());//9 获取当前时间的小时System.out.println(nowTime.getMinute());//51 获取当前时间的分钟System.out.println(nowTime.getSecond());//11 获取当前时间的秒
  • LocalDateTime获取当前年、月、日、时、分、秒
    (LocalDateTime相当于LocalDate + LocalTime的合体)
LocalDateTime localDateTime=LocalDateTime.now();System.out.println(localDateTime);//2021-04-06T09:51:11.987  获取当前的年月日时分秒System.out.println(localDateTime.getYear());//2021 获取当前年份System.out.println(localDateTime.getMonth().getValue());//4 获取当前月System.out.println(localDateTime.getDayOfMonth());//6 获取当前日System.out.println(localDateTime.getHour());//9 获取当前时System.out.println(localDateTime.getMinute());//51 获取当前分System.out.println(localDateTime.getSecond());//11 获取当前秒System.out.println(localDateTime.getDayOfYear());//96 今天是今年的第几天System.out.println(localDateTime.getDayOfWeek().getValue());//2 今天是星期几

三、日期和时间格式化

  • LocalDate格式化
LocalDate getdata=LocalDate.now();DateTimeFormatter f1=DateTimeFormatter.ofPattern("yyyy.MM.dd");System.out.println(getdata.format(f1));//2021.04.06
  • LocalTime格式化
LocalTime getTime=LocalTime.now();DateTimeFormatter f1=DateTimeFormatter.ofPattern("HH-mm-ss");System.out.println(getTime.format(f1));//16-27-08
  • LocalDateTime 格式化
LocalDateTime localDateTime=LocalDateTime.now();DateTimeFormatter f1=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");System.out.println(localDateTime.format(f1));//2021-04-06 10:04:32
LocalDateTime localDateTime=LocalDateTime.now();DateTimeFormatter f2=DateTimeFormatter.ofPattern("yyyy.MM.dd-HH:mm");System.out.println(localDateTime.format(f2));//2021.04.06-10:04
LocalDateTime localDateTime=LocalDateTime.now();System.out.println(localDateTime.toString());//2021-04-06T11:33:59.617

添加时区:

LocalDateTime localDateTime=LocalDateTime.now();OffsetDateTime date=localDateTime.atOffset(ZoneOffset.ofHours(+8));System.out.println(date.toString());//2021-04-06T10:55:09.599+08:00

注意:
LocalDateTime 当秒数刚好为0的时候格式化后秒会被省略,格式化要指定到秒。

LocalDateTime localDateTime=LocalDateTime.parse("2021-04-06T10:00:00");String time= localDateTime.toString();System.out.println(time);//2021-04-06T10:00DateTimeFormatter f=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String time1= localDateTime.format(f);System.out.println(time1);//2021-04-06 10:00:00

四、字符串与LocalDate、LocalTime、LocalDateTime之间的互换

  • 日期字符串转LocalDate类型
LocalDate getdata=LocalDate.parse("2021-04-06");//年月日用-分开,月份和日期如果小于10要补零System.out.println(getdata);//2021-04-06
  • 20220805 转 2022-08-05:
String dayAfterTommorrow="20220805";//除了DateTimeFormatter.BASIC_ISO_DATE格式DateTimeFormatter里还有其他格式可选择LocalDate formatted=LocalDate.parse(dayAfterTommorrow,DateTimeFormatter.BASIC_ISO_DATE);System.out.println("格式化后的日期为:  "+formatted);//格式化后的日期为:  2022-08-05
  • 时间字符串转LocalTime类型
//时间字符串转LocalTime类型LocalTime gettime=LocalTime.parse("16:59:09");//时分秒用:分开,时分秒如果小于10要补零System.out.println(gettime);
  • 日期时间字符串转LocalDateTime类型
    (年月日之间要用-分割,时分秒用:分割,日期和时间之间用T分割)
LocalDateTime localDateTime=LocalDateTime.parse("2021-04-06T10:13:12");System.out.println(localDateTime);//2021-04-06T10:13:12
  • LocalDate、LocalTime、LocalDateTime类型转为字符串直接toString
LocalDate nowdata=LocalDate.now();System.out.println(nowdata.toString());//2021-04-16LocalTime nowTime=LocalTime.now();System.out.println(nowTime.toString());//16:16:04.372LocalDateTime localDateTime=LocalDateTime.now();System.out.println(localDateTime.toString());//2021-04-16T16:16:04.373

五、时间创建

LocalDateTime ofTime=LocalDateTime.of(2022,4,21,8,8,8);System.out.println("当前精确时间:"+ ofTime);LocalDate localDate=LocalDate.of(2022,4,21);System.out.println("当前日期:"+ localDate);LocalTime localTime=LocalTime.of(12,01,01);System.out.println("当天时间:"+ localTime);

输出:

当前精确时间:2022-04-21T08:08:08
当前日期:2022-04-21
当天时间:12:01:01

六、日期和时间的加减

日期的加减:

LocalDate today=LocalDate.now();System.out.println("今天的日期为:"+today);//plus() 方法用来增加天、周、月,ChronoUnit 类声明了这些时间单位//可以用同样的方法增加 1 个月、1 年、1 小时、1 分钟甚至一个世纪LocalDate nextWeek= today.plus(2,ChronoUnit.WEEKS);System.out.println("两周后的日期为:"+nextWeek);

输出:

今天的日期为:2022-08-14
一周后的日期为:2022-08-28

日期时间的加减:

LocalDateTime now=LocalDateTime.now();System.out.println("当前时间:"+now);LocalDateTime plusTime= now.plusMonths(1).plusDays(4).plusHours(1).plusMinutes(1).plusSeconds(1);LocalTime plusTime1= now.plusHours(3).toLocalTime();System.out.println("增加1月4天1小时1分钟1秒时间后:"+ plusTime);System.out.println("3个小时后的时间为:"+plusTime1);LocalDateTime minusTime= now.minusMonths(2).minusDays(3);System.out.println("减少2个月3天时间后:"+ minusTime);

输出:

当前时间:2022-04-21T10:30:06.155
增加141小时1分钟1秒时间后:2022-05-25T11:31:07.155
减少2个月3天时间后:2022-02-18T10:30:06.155

七、判断平年和闰年

  • 指定具体年月日
LocalDate localDate=LocalDate.of(1999,1,7);//设置指定日期boolean bo= localDate.isLeapYear();//闰年为ture,平年是falseSystem.out.println(bo);//false
  • 指定年份
boolean bo1=IsoChronology.INSTANCE.isLeapYear(1999);//指定年份System.out.println(bo);//false
  • LocalDateTime和LocalDate 判断平年闰年
LocalDateTime now=LocalDateTime.now();System.out.println("当前时间:"+ now);System.out.println("今年是否闰年:"+Year.isLeap(now.getYear()));LocalDate data=LocalDate.now();System.out.println("当前日期:"+ data);System.out.println("今年是否闰年:"+Year.isLeap(data.getYear()));

输出:

当前时间:2022-04-21T10:51:57.825
今年是否闰年:false
当前日期:2022-04-21
今年是否闰年:false

八、判断指定日期是星期几

LocalDate localDate=LocalDate.of(2021,1,25);DayOfWeek dayOfWeek= localDate.getDayOfWeek();System.out.println(dayOfWeek);//MONDAY
LocalDate localDate=LocalDate.of(2021,1,25);//判断是不是星期一System.out.println(localDate.getDayOfWeek()==DayOfWeek.MONDAY);//true

判断今天是星期几:

DayOfWeek dayOfWeek=LocalDate.now().getDayOfWeek();System.out.println(dayOfWeek);

九、计算指定日期的月份有多少天

获取天数:

LocalDate endDate=LocalDate.of(2021,2,1);int monthDay= endDate.lengthOfMonth();System.out.println(monthDay);//输出28,2021年2月有28天

获取本月最后一天的时间或日期:

LocalDateTime now=LocalDateTime.now();System.out.println("当前时间:"+ now);LocalDateTime lastDay= now.with(TemporalAdjusters.lastDayOfMonth());System.out.println("本月最后一天的当前时间:"+ lastDay);LocalDate nowData=LocalDate.now();System.out.println("当前日期:"+ now);LocalDate lastDay1= nowData.with(TemporalAdjusters.lastDayOfMonth());System.out.println("本月最后一天:"+ lastDay1);

十、比较两个时间的早晚

LocalTime gettimeStart=LocalTime.parse("00:01:40");LocalTime gettimeEnd=LocalTime.parse("00:03:20");//-1表示早于,1表示晚于,0则相当int value= gettimeStart.compareTo(gettimeEnd);System.out.println(value);

十一、计算两个时间相差多久(倒计时)

LocalTime gettimeStart=LocalTime.parse("00:01:40");LocalTime gettimeEnd=LocalTime.parse("00:03:20");System.out.println("相差: "+HOURS.between(gettimeStart, gettimeEnd)+"小时");//相差: 0小时System.out.println("相差: "+MINUTES.between(gettimeStart, gettimeEnd)+"分钟");//相差: 1分钟System.out.println
  • 作者:西凉的悲伤
  • 原文链接:https://blog.csdn.net/qq_33697094/article/details/115454081
    更新时间:2022年11月18日12:57:20 ,共 7799 字。