zoukankan      html  css  js  c++  java
  • Java8中的时间处理

    Java8中的时间处理

    Java8提供了全新的时间处理框架,这里就可以完全丢弃之前的Date、Calendar了。

    具体的API的使用都是比较简单的。这里就不展开介绍了。

    这里主要介绍下一些主要的类

    LocalDateTime

    我们一般常用的就是这个了,用这个来表示日期时间。如LocalDateTime.now()就可以基于当前默认时区得到当前的日期时间。

    由于全球有好多时区,同一个日期时间,在不同的时区,反映到时间轴上是不同的。

    LocalDateTime类型的日期时间是没包含时区,所以它不能对应到时间轴上。说的直白点就是LocalDateTime不能转换成自 1970-01-01T00:00:00Z 纪元以来的毫秒数


    ZonedDateTime

    ZonedDateTime可以理解就是在LocalDateTime的基础上添加上时区,所以它是可以反映到时间轴上的。

    下面用夏令时举个例子来看看LocalDateTime和LocalDateTime的区别。

    夏令时是什么这里就不展开了,具体可以网上查下。看看我国1986开始的夏令时。

    简单来说就是在夏令时开始的时候,将时钟向后拨1个小时。对应我国1986年开始的夏令时的做法,就是在每年四月中旬的第一个星期日当时钟到达凌晨2点时,直接将时钟拨到凌晨3点。也就是凌晨1点和凌晨3点之间之差1个小时。

    由于1986年是开始实施的,所以1986年的夏令时是1986年5月4日开始的。

    我们看看1987年的夏令时开始

    根据我国当时的夏令时政策,1987年应该是1987年4月12日开始的。具体来说就是在1987-04-12 01:00:00 过一个小时后,时间应该是1987-04-12 03:00:00

            LocalDateTime localDateTime = LocalDateTime.of(1987, 4, 12, 1, 0, 0, 0);
            System.out.println(localDateTime);
            System.out.println(localDateTime.plusHours(1));
    

    执行上面的代码就可以看到当1987-04-12 01:00:00增加1小时后,时间是1987-04-12 02:00:00。

    这个也好理解,因为LocalDateTime并没有包含时区,1987-04-12 02:00:00这个夏令时只是中国的,并不是全球统一的,如果1987-04-12 02:00:00将直接变成1987-04-12 03:00:00放到中国以外的其他国家就是错误的。


            ZonedDateTime zonedDateTime = ZonedDateTime.of(1987, 4, 12, 1, 0, 0, 0, ZoneId.systemDefault());
            System.out.println(zonedDateTime);
            System.out.println(zonedDateTime.plusHours(1));
    

    执行上面的代码可以看到当1987-04-12 01:00:00增加1小时后,时间变成了是1987-04-12 03:00:00。这个也就能说明问题了。

    同时从打印结果也能看到时区自动从+08:00[Asia/Shanghai]变成了+09:00[Asia/Shanghai]


    Instant

    Instant表示时间轴上的一个瞬时时间,简单来说就是表示自 1970-01-01T00:00:00Z 纪元以来的秒数、毫秒数等等

    ZonedDateTime和Instant都能对应到时间轴上,所以它们两个是可以相互转化的。

            Instant instant = zonedDateTime.toInstant();
            ZonedDateTime zonedDateTime1 = instant.atZone(zonedDateTime.getZone());
    

    其他一些常用的各种类型之间转化的API

            //ZonedDateTime 转  Instant
            Instant instant = ZonedDateTime.now().toInstant();
    
     
            //获取UTC毫秒数
            long epochMilli = instant.toEpochMilli();
            
    
            //Instant 转  ZonedDateTime
            ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
    
            //字符串 转  ZonedDateTime
            ZonedDateTime zonedDateTime2 = ZonedDateTime.parse(zonedDateTime.toString());
    
            //基于UTC 偏移的毫秒数
            int totalSeconds = zonedDateTime.getOffset().getTotalSeconds();
    
            //Instant 转  LocalDateTime
            LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    
            //LocalDateTime 转  ZonedDateTime
            ZonedDateTime zonedDateTime1 = localDateTime.atZone(ZoneId.systemDefault());
    
    
            ZoneRules zoneRules = ZoneId.systemDefault().getRules();
    
            //判断是否是夏令时时间
            boolean daylightSavings = zoneRules.isDaylightSavings(instant);
    
    
            Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
            //Calendar 转 Instant
            Instant instant1 = calendar.toInstant();
    
            //Calendar  转   ZonedDateTime
            Calendar now = Calendar.getInstance();
            ZonedDateTime zdt = ZonedDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault()));
    
            //Date 转 Instant
            Date date = new Date();
            Instant inst = date.toInstant();
    
            // Instant 转 Date
            Date newDate = Date.from(inst);
    
            //GregorianCalendar 转 ZonedDateTime
            GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
            TimeZone tz = cal.getTimeZone();
            ZonedDateTime zdt1 = cal.toZonedDateTime();
            
            //ZonedDateTime 转 GregorianCalendar
            GregorianCalendar newCal = GregorianCalendar.from(zdt1);
    
            LocalDateTime ldt = zdt.toLocalDateTime();
            LocalDate date2 = zdt.toLocalDate();
            LocalTime time2 = zdt.toLocalTime();
    

    更详细的资料,还是看官方的文档吧。https://docs.oracle.com/javase/tutorial/datetime/index.html

  • 相关阅读:
    看清爱情的本质,学会受伤。
    美股课堂:美国银行开户亲历记
    京JS 2013
    果皮移动
    果皮移动 移动电商!
    http://www.cutt.com/
    简网APP工场-服务介绍
    Get started
    中科院青年公寓
    c++ replaceAll
  • 原文地址:https://www.cnblogs.com/wbo112/p/15776907.html
Copyright © 2011-2022 走看看