Date日期输出可读性较差java
Date date = new Date(); System.out.println(date);
打印输出的结果:segmentfault
Sat Nov 14 11:03:41 CST 2020
joda-time
, commons-lang
在java.time包中提供了不少新的类,一般主要使用到的是LocalDate
, LocalTime
, LocalDateTime
, ZoneId
, ZoneDateTime
; 关系图以下:api
LocaDate这个类自己不包含时间和时区信息,只包含了日期信息;提供了不少方法来获取经常使用的值:星期几,几月 ...lua
经常使用的静态构造LocaDate
方法spa
LocalDate.of(2020, 11, 14); //指定年月日 LocalDate.of(2020, Month.NOVEMBER, 14); //指定年月日 使用Month枚举类 LocalDate.ofYearDay(2020, 10); //2020年第10天 => 2020-01-10 LocalDate.now(); //当前时间 System.out.println(LocalDate.now()); // 比较好的可读性输出 => 2020-11-14
LocaDate
经常使用实例方法code
LocalDate now = LocalDate.of(2020, 11, 14); System.out.println(now.getMonth()); //月份的枚举 => NOVEMBER System.out.println(now.getMonthValue()); //月份的数字 => 11 System.out.println(now.getDayOfMonth()); //几号 => 14 System.out.println(now.getDayOfYear()); // 一年中的第几天 => 319 System.out.println(now.getDayOfWeek()); // 周几枚举 => SATURDAY System.out.println(now.lengthOfMonth()); //本月多少天 => 30 System.out.println(now.lengthOfYear()); //本年多少天 => 366
LocalTime只包含时间信息orm
LocalTime.of(12, 9, 10); //时、分、秒 LocalTime.now(); LocalTime time = LocalTime.of(12, 9, 10); System.out.println(time.getHour()); System.out.println(time.getMinute()); System.out.println(time.getSecond());
LocalDateTime 从这个类的名字能够看出是合并了LocalDate
, LocalTime
,只包含日期和时间,不包含时区信息
构造的方式,能够直接使用静态方法建立,也能够经过LocalDate
,LocalTime
合并blog
LocalDateTime.of(LocalDate.now(), LocalTime.now()); LocalDateTime.of(2020, 11, 14, 13, 10, 50); LocalDate.now().atTime(LocalTime.now()); LocalTime.now().atDate(LocalDate.now()); LocalDateTime.now();
因为LocalDateTime
是LocalDate
, LocalTime
的合并,因此LocalDate
, LocalTime
有的实例方法,基本在LocalDateTime
中均可以找到字符串
ZoneId 用来替代老版本TimeZone
, 每一个ZoneId
都有一个特定的地区标识;get
ZoneId.of("Asia/Shanghai"); ZoneId.systemDefault()
查看全部的地区标识能够进入到ZoneId
源码
ZoneDateTime带有日期、时间、时区信息,是LocalDateTime
和ZoneId
的组合
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()); ZonedDateTime.of(LocalDate.now(),LocalTime.now(),ZoneId.of("Asia/Shanghai"));
常常咱们会遇到须要求两个时间之间相差的时间, 如何实现呢?
Java8也提供给了相应的API支持, Duration
、Period
Duration between = Duration.between(LocalTime.of(13, 0), LocalTime.of(14, 0)); between.getSeconds(); //返回两个时间相差的秒数 => 3600
Duration
是经过秒和毫秒来记录时间的长短,因此只能处理两个LocalTime
, DateLocalTime
, ZonedDateTime
; 若是传入的是LocalDate
,将会抛出异常
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Seconds at java.time.LocalDate.until(LocalDate.java:1614) at java.time.Duration.between(Duration.java:475) at com.haixue.crm.stock.service.LocalTest.testDate(LocalTest.java:121) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
在这种状况下就能够使用Period
Period between1 = Period.between(LocalDate.of(2020, 11, 13), LocalDate.of(2020, 11, 13)); between1.getDays(); //返回相差的天数 => 1
LocalDate now2 = LocalDate.of(2020, 11, 13); System.out.println(now2.plusDays(2)); //加2天 => 2020-11-15 System.out.println(now2.plusMonths(1)); //加1月 => 2020-12-13 System.out.println(now2.plusWeeks(1)); //加一周 => 2020-11-20 System.out.println(now2.minusDays(1)); //减一天 => 2020-11-12 System.out.println(now2.minusMonths(1)); //减一月 => 2020-10-13 System.out.println(now2.minusYears(1)); //减一年 => 2019-11-13 System.out.println(now2.withYear(2021)); //修改年 => 2021-11-13
TemporalAdjuster
很好的实现,TemporalAdjuster
可以实现不少定制化的日期操做,Java8在TemporalAdjusters
已经给提供了默认的不少实现。LocalDate now3 = LocalDate.of(2020, 11, 13); System.out.println(now3.with(TemporalAdjusters.firstDayOfYear())); // 本年的第一天 => 2020-01-01 System.out.println(now3.with(TemporalAdjusters.next(DayOfWeek.MONDAY))); //下一个周一 => 2020-11-16 System.out.println(now3.with(TemporalAdjusters.lastDayOfMonth())); // 本月的最后一天 => 2020-11-30 System.out.println(now3.with(TemporalAdjusters.lastDayOfYear())); // 本年的最后一天 => 2020-12-31
TemporalAdjuster
实现获取当天的开始时间和当天的最后时间LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 13, 10, 10, 10); System.out.println(localDateTime); System.out.println(localDateTime.with((temporal) -> temporal.with(ChronoField.SECOND_OF_DAY, 0))); // 当天的凌晨 => 2020-11-13T00:00 System.out.println(localDateTime.with((temporal) -> temporal.with(ChronoField.SECOND_OF_DAY, temporal.range(ChronoField.SECOND_OF_DAY).getMaximum()))); // 当天的最后一刻时间 => 2020-11-13T23:59:59
对日期的字符串解析和格式化的操做是经常使用的,首先看下不用第三方包如何简单的实现日期解析
System.out.println(LocalDateTime.parse("2020-11-14T20:50:00")); // 输出:2020-11-14T20:50 System.out.println(LocalDateTime.parse("2020/11/14 20:50:00", DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))); // 输出:2020-11-14T20:50
实现格式化一样也简单
LocalDate now4 = LocalDate.of(2020, 11, 13); System.out.println(now4.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"))); //输出:2020/11/13 LocalDateTime localDateTime2 = LocalDateTime.of(2020, 11, 13, 10, 10, 10); System.out.println(localDateTime2.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))); //输出:2020/11/13 10:10:10
本人菜鸟,若是有任何写的不对的地方,欢迎在评论区指出