• 廖雪峰Java7处理日期和时间-3java.time的API-2ZonedDateTime


    ZonedDatetime = LocalDateTime + ZoneId
    ZonedDateTime:带时区的日期和时间
    ZoneId:新的API定义的时区对象(取代几句的java.util.TimeZone)
    Instant:时刻对象(epoch seconds)

    1.ZonedDateTime对象为携带时区的日期时间

    • now()
    • getZone()
        public static void main(String[] args) {
            ZonedDateTime zbj = ZonedDateTime.now();
            System.out.println("当前时区的日期和时间:		"+zbj);
            ZonedDateTime zny = ZonedDateTime.now(ZoneId.of("America/New_York"));
            System.out.println("纽约时区的当前时间和日期:	"+zny);
        }
    
    ## 2.添加时区LocalDateTime->ZonedDateTime atZone()只是为日期时间添加时区,只是时区不一样 ```#java public static void main(String[] args) { LocalDateTime ldt = LocalDateTime.of(2016,11,30,15,16,17); ZonedDateTime bj = ldt.atZone(ZoneId.systemDefault()); System.out.println("当前时区的日期和时间: "+bj); ZonedDateTime ny = ldt.atZone(ZoneId.of("America/New_York")); System.out.println("纽约时区的当前时间和日期: "+ny); } ``` ## 3.时区转换 withZoneSameInstant()将某一时区的时刻转换为目标时区的时刻 ```#java public static void main(String[] args) { LocalDateTime ldt = LocalDateTime.of(2016,11,30,15,16,17); ZonedDateTime bj = ldt.atZone(ZoneId.systemDefault()); System.out.println("当前时区的日期和时间: "+bj); ZonedDateTime ny = bj.withZoneSameInstant(ZoneId.of("America/New_York")); System.out.println("纽约时区的当前时间和日期: "+ny); } ``` ## 4.Instant对象表示时刻 获取Instant对象: * 使用Instant获取,如Instant.now(),Instant.ofEpochMilli()... * 通过ZonedDateTime对象获取,如ZonedDateTime.now().toInstant() * 获取epoch time,Instant.getEpochSecond() ```#java public static void main(String[] args) { Instant ins = Instant.now(); System.out.println(ins); Instant ins2 = ZonedDateTime.now().toInstant();//ZonedDateTime对象通过toInstant就可以转化为Instant对象 System.out.println(ins2); ZonedDateTime zdt = ins.atZone(ZoneId.of("Z"));//Instant对象通过atZone就可以转换为ZonedDateTime对象 System.out.println(zdt);//将Instant对象转换为ZonedDateTime对象,打印结果同Instant对象 long epoch = ins.getEpochSecond();//通过getEpochSecond()返回一个long类型的整形 System.out.println(epoch); ZonedDateTime zdt2 = ZonedDateTime.now(); System.out.println(zdt2); } ``` ## 5.Instant、ZonedDateTime、long的互相转换 ```#java public static void main(String[] args) { ZonedDateTime zdt = ZonedDateTime.now();
        //ZonedDateTime <-> Instant
        Instant ins1 = zdt.toInstant();
        ZonedDateTime zdt1 = ins1.atZone(ZoneId.systemDefault());
    
        //Instant <-> long
        long l1 = ins1.toEpochMilli();
        Instant ins2 = Instant.ofEpochMilli(l1);
    
        //long <-> ZonedDateTime
        long l2 = ZonedDateTime.now().toEpochSecond();
        ZonedDateTime zdt2 = Instant.ofEpochMilli(l2).atZone(ZoneId.systemDefault());
        
        System.out.println(zdt1+"	"+ins1+"	"+l1+"毫秒");
        System.out.println(zdt2+"	"+ins2+"	"+l2+"秒");
    }
    
    <img src="https://img2018.cnblogs.com/blog/1418970/201904/1418970-20190412195835705-242422631.png" width="500" />
    ##    6.TemporalAmount
    表示一段时间:1天/2小时/30分钟,有两个子类:
    *    Duration:Days Hours Minutes Seconds Mills Nanos
    *    Peroid:Day Month Week Year
    
    可以加减一个TemporalAmount对象
    *    plus(TemporalAmount)
    *    minus(TemporalAmount)
    ```#java
        public static void main(String[] args) {
            Period towDays = Period.ofDays(2);
            Duration oneHour = Duration.ofHours(1);
            Duration fiveMin = Duration.ofMinutes(5);
            ZonedDateTime zdt = ZonedDateTime.now().minus(towDays).plus(oneHour).plus(fiveMin);
            System.out.println(ZonedDateTime.now());
            System.out.println(zdt);
        }
    

    7.java.time提供的其他Class

    • ZoneOffset
    • OffsetDateTime
    • OffsetTime
    • ChronoLocalDate/ChronoLocalDateTime:用于实现其他历法

    8.总结:

    • ZonedDateTime就是LocalDateTime关联ZoneId
    • ZonedDateTime可以做时区转换,注意不要自己试图通过加减时区偏移量计算。因为时区的转换不仅设计到夏令时,还包括历史夏令时的改动。
    • ZoneId表示时区
    • Instant表示时刻(内部用long表示epoch second)
    • ZonedDateTime、Instant、Long可以相互转换
  • 相关阅读:
    《数据结构第一章复习》
    《图的基本操作》
    《矩阵的一些基本操作》
    <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>
    《两个二维数组(矩阵)相乘》
    C#隐藏与显示系统任务栏和开始菜单栏按钮
    C#通过窗体属性缩小一定尺寸时,无法再缩小窗体尺寸问题
    C#一个窗体调用另一个窗体的方法
    C#异步线程
    C#中MessageBox.Show问题(让提示窗口不显示在任务栏中)
  • 原文地址:https://www.cnblogs.com/csj2018/p/10692478.html
Copyright © 2020-2023  润新知