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

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

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

  • now()
  • getZone()
    public static void main(String[] args) {
        ZonedDateTime zbj = ZonedDateTime.now();
        System.out.println("当前时区的日期和时间:\t\t"+zbj);
        ZonedDateTime zny = ZonedDateTime.now(ZoneId.of("America/New_York"));
        System.out.println("纽约时区的当前时间和日期:\t"+zny);
    }

1418970-20190412110536308-1119119925.png

2.添加时区LocalDateTime->ZonedDateTime

atZone()只是为日期时间添加时区,只是时区不一样

    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("当前时区的日期和时间:\t\t"+bj);
        ZonedDateTime ny = ldt.atZone(ZoneId.of("America/New_York"));
        System.out.println("纽约时区的当前时间和日期:\t"+ny);
    }

1418970-20190411220759564-460638845.png

3.时区转换

withZoneSameInstant()将某一时区的时刻转换为目标时区的时刻

    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("当前时区的日期和时间:\t\t"+bj);
        ZonedDateTime ny = bj.withZoneSameInstant(ZoneId.of("America/New_York"));
        System.out.println("纽约时区的当前时间和日期:\t"+ny);
    }

1418970-20190411221514272-2077653383.png

4.Instant对象表示时刻

获取Instant对象:

  • 使用Instant获取,如Instant.now(),Instant.ofEpochMilli()...
  • 通过ZonedDateTime对象获取,如ZonedDateTime.now().toInstant()
  • 获取epoch time,Instant.getEpochSecond()
    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);
    }

1418970-20190412092619408-817976753.png

5.Instant、ZonedDateTime、long的互相转换

1418970-20190412214051931-719259761.png

    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+"\t"+ins1+"\t"+l1+"毫秒");
        System.out.println(zdt2+"\t"+ins2+"\t"+l2+"秒");
    }

1418970-20190412195835705-242422631.png

6.TemporalAmount

表示一段时间:1天/2小时/30分钟,有两个子类:

  • Duration:Days Hours Minutes Seconds Mills Nanos
  • Peroid:Day Month Week Year

可以加减一个TemporalAmount对象

  • plus(TemporalAmount)
  • minus(TemporalAmount)
    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);
    }

1418970-20190412095551765-428099398.png

7.java.time提供的其他Class

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

8.总结:

  • ZonedDateTime就是LocalDateTime关联ZoneId
  • ZonedDateTime可以做时区转换,注意不要自己试图通过加减时区偏移量计算。因为时区的转换不仅设计到夏令时,还包括历史夏令时的改动。
  • ZoneId表示时区
  • Instant表示时刻(内部用long表示epoch second)
  • ZonedDateTime、Instant、Long可以相互转换

转载于:https://www.cnblogs.com/csj2018/p/10692478.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值