比如新的时间格式不管什么操作都是产生新实例,是线程安全的。
一共有三个常用类LocalDate,LocalTime,LocalDateTime。
其中的方法都是见名知意,可以说是非常好用,下面仅做演示。
//表示日期的 LocalDate localDate = LocalDate.now(); System.out.println("当前日期:" + localDate); //表示时间的 LocalTime localTime = LocalTime.now(); System.out.println("当前时间:" + localTime); //表示日期加时间 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println("当前日期时间:" + localDateTime); //获取时间的每个值 System.out.println("年:" + localDateTime.getYear()); System.out.println("月:" + localDateTime.getMonthValue()); System.out.println("日:" + localDateTime.getDayOfMonth()); System.out.println("时:" + localDateTime.getHour()); System.out.println("分:" + localDateTime.getMinute()); System.out.println("秒:" + localDateTime.getSecond()); //指定时间的创建方式 LocalDateTime localDateTime1 = LocalDateTime.of(2021, 12, 31, 23, 23, 23); System.out.println("自定义日期时间:" + localDateTime1); //增加两天 LocalDateTime localDateTime2 = localDateTime1.plusDays(2); System.out.println("自定义日期时间+两天:" + localDateTime2);
其结果为 当前日期:2021-08-04 当前时间:17:05:15.793 当前日期时间:2021-08-04T17:05:15.793 年:2021 月:8 日:4 时:17 分:5 秒:15 自定义日期时间:2021-12-31T23:23:23 自定义日期时间+两天:2022-01-02T23:23:23
时间戳就是从1970年1月1日0时0分0秒至今计算的毫秒数,使用Instant类。
//默认获取UTC时间 比东八区早8个小时 Instant instant = Instant.now(); System.out.println("默认时间:" + instant); Instant now = Instant.now(Clock.systemUTC()); System.out.println("当前时区时间:" + instant); System.out.println("当前时区毫秒:" + now.toEpochMilli()); System.out.println("当前时区秒:" + now.getEpochSecond());
其结果为 默认时间:2021-08-04T09:33:58.596Z 当前时区时间:2021-08-04T09:33:58.596Z 当前时区毫秒:1628069638641 当前时区秒:1628069638
时间范围用Duration或者Period获取,两者的不同是Peirod只接收LocalDate类型的参数而Duration接收的参数要实现Temporal接口。所以Period只能精确到天,Duration能精确到毫秒甚至纳秒。
//时间之间间隔的 LocalDateTime localDateTime1 = LocalDateTime.now(); Thread.sleep(1000); LocalDateTime localDateTime2 = LocalDateTime.now(); Duration duration = Duration.between(localDateTime1, localDateTime2); System.out.println("获取毫秒数" + duration.toMillis()); //日期之间间隔的 LocalDate localDate1 = LocalDate.of(2021, 7, 8); LocalDate localDate2 = LocalDate.of(2021, 7, 12); Period period = Period.between(localDate1, localDate2); System.out.println("获取天数" + period.getDays());
其结果为 获取毫秒数1009 获取天数4
在temporal包下,有一个类TemporalAdjusters提供了大量的静态方法去修改时间。
LocalDateTime localDateTime = LocalDateTime.now(); System.out.println("当前时间:" + localDateTime); //指定天数到下周五 LocalDateTime localDateTime1 = localDateTime.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)); System.out.println("下周五:" + localDateTime1); //指定哪一天 LocalDateTime localDateTime2 = localDateTime.withDayOfMonth(10); System.out.println("指定时间:" + localDateTime2); LocalDateTime localDateTime3 = localDateTime.withDayOfYear(300); System.out.println("指定时间:" + localDateTime3); //自定义 下一个工作日 LocalDateTime localDateTime4 = localDateTime.with((l) -> { LocalDateTime s2 = (LocalDateTime) l; DayOfWeek dayOfWeek = s2.getDayOfWeek(); if (dayOfWeek.equals(DayOfWeek.FRIDAY)) { return s2.plusDays(3); } else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) { return s2.plusDays(2); } else { return s2.plusDays(1); } }); System.out.println("下一个工作日:" + localDateTime4);
其结果为 当前时间:2021-08-04T19:25:11.288 下周五:2021-08-06T19:25:11.288 指定时间:2021-08-10T19:25:11.288 指定时间:2021-10-27T19:25:11.288 下一个工作日:2021-08-05T19:25:11.288
格式化使用DateTimeFormatter进行,既可以从DateTimeFormatter调用方法,也可以将该类的方法当做参数传入。
LocalDateTime now = LocalDateTime.now(); String str = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssSSS")); String str1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(now); System.out.println(str); System.out.println(str1); //字符串转时间格式化毫秒值好像必须有. 暂不知道为什么 LocalDateTime localDateTime = LocalDateTime.parse("20210808121212.111", DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSS")); LocalDateTime localDateTime1 = LocalDateTime.from(DateTimeFormatter.ofPattern("yyyyMMddHHmmss").parse("20210808121212")); System.out.println(localDateTime); System.out.println(localDateTime1);
其结果为 2021-08-04 19:50:27102 2021-08-04 19:50:27 2021-08-08T12:12:12.111 2021-08-08T12:12:12