新的时间处理包java.time

木叶飞舞之处,火亦生生不息


java8中定义了新的时间包java.time较于1.8之前的 Date,Calendar ,TimeZone,SimpleDateFormat有了更好的实现方式。

比如新的时间格式不管什么操作都是产生新实例,是线程安全的。

一、包的层级结构

  • java.time:标准的日期和时间的类
  • java.time.chrono:特殊的时间,比如日本的平成,*的民国
  • java.time.format:时间格式化
  • java.time.temporal:时间校正器
  • java.time.zone:时区

二、常用方法示例

一、日期

一共有三个常用类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
上一篇:零基础java自学流程-Java语言进阶88


下一篇:前端传String类型,后端转LocalDateTime的三种方法