【发布时间】:2016-09-22 01:30:00
【问题描述】:
我默认使用巴西时区,但是当捕捉到纽约的一个 LocalDateTime 并转换为 java.tim.Instant 时,instant 被正确填充。问题是,当我尝试使用 Date.from (instantValue) 生成 Date,而不是生成纽约的 date 时,我最终从巴西获得当前日期。
ZoneId nyZone = ZoneId.of("America/New_York");
ZoneId brazilZone = ZoneId.of("America/Recife");
LocalDateTime ldtBrazil = LocalDateTime.now(brazilZone);
LocalDateTime ldtNY = LocalDateTime.now(nyZone);
Instant instantBrazil = ldtBrazil.toInstant(ZoneOffset.UTC);
Instant instantNY = ldtNY.toInstant(ZoneOffset.UTC);
System.out.println("-------LocalDateTime-------");
System.out.println("ldtBrazil : "+ldtBrazil);
System.out.println("ldtNY : "+ldtNY);
System.out.println("\n-------Instant-------");
System.out.println("instantBrazil: "+instantBrazil);
System.out.println("instantNY : "+instantNY);
long milliBrazil = instantBrazil.toEpochMilli();
long milliNY = instantNY.toEpochMilli();
System.out.println("\n----------Milli----------");
System.out.println("miliBrazil : "+milliBrazil);
System.out.println("miliNY : "+milliNY);
Date dateBrazil = Date.from(instantBrazil);
Date dateNY = Date.from(instantNY);
System.out.println("\n---------Date From Instant---------");
System.out.println("dateBrazil: "+dateBrazil);
System.out.println("dateNY : "+dateNY);
System.out.println("\n---------Date From Milli---------");
System.out.println("dateBrazil: "+new Date(milliBrazil));
System.out.println("dateNY : "+new Date(milliNY));
结果
-------LocalDateTime-------
ldtBrazil : 2016-09-21T22:11:52.118
ldtNY : 2016-09-21T21:11:52.118
-------Instant-------
instantBrazil: 2016-09-21T22:11:52.118Z
instantNY : 2016-09-21T21:11:52.118Z
----------Milli----------
miliBrazil : 1474495912118
miliNY : 1474492312118
---------Date From Instant---------
dateBrazil: Wed Sep 21 19:11:52 BRT 2016
dateNY : Wed Sep 21 18:11:52 BRT 2016 //this data must be related to NY LocalDateTime, but reiceved a same date of Brazil.
---------Date From Milli---------
dateBrazil: Wed Sep 21 19:11:52 BRT 2016
dateNY : Wed Sep 21 18:11:52 BRT 2016
【问题讨论】:
-
这是因为
Date真的只是一瞬间。它不存储您所在的时区。当您打印Date对象时,它们将使用您当前的时间区域设置格式化,其中包括您的时区。因此,每当您使用System.out.println直接显示日期时,它总是会显示 BRT 时区,或者您当地的时区。 -
好的,但是我调用new Date(milli),milli代表一个没有时区的日期。
-
当然,但是 Date.from() 的工作方式相同。无论您如何制作
Date对象,它都没有内置时区。 -
您的
instantBrazil和instantNY值不是当前时间,因为您使用 UTC 而不是巴西或纽约的时区转换它们。所以你这样做引入了几个小时的错误。