Ura*_*rel 10 java timezone java-8 java-time
如果我们在14:05离开法兰克福,并在16:40到达洛杉矶.飞多长时间?
我试过以下:
ZoneId frank = ZoneId.of("Europe/Berlin");
ZoneId los = ZoneId.of("America/Los_Angeles");
LocalDateTime dateTime = LocalDateTime.of(2015, 02, 20, 14, 05);
LocalDateTime dateTime2 = LocalDateTime.of(2015, 02, 20, 16, 40);
ZonedDateTime berlinDateTime = ZonedDateTime.of(dateTime, frank);
ZonedDateTime losDateTime2 = ZonedDateTime.of(dateTime2, los);
int offsetInSeconds = berlinDateTime.getOffset().getTotalSeconds();
int offsetInSeconds2 = losDateTime2.getOffset().getTotalSeconds();
Duration duration = Duration.ofSeconds(offsetInSeconds - offsetInSeconds2);
System.out.println(duration);
Run Code Online (Sandbox Code Playgroud)
但我无法得到大约11小时30分钟的成功答案.有人请帮助我弄清楚上面的问题.谢谢 :)
Mat*_*int 10
getOffset
是错误的方法.这将获得该区域在该时间点的UTC偏移量.它无助于确定一天中的实际时间.
一种方法是使用明确获取Instant
每个值表示的toInstant
.然后Duration.between
用来计算经过的时间.
Instant departingInstant = berlinDateTime.toInstant();
Instant arrivingInstant = losDateTime2.toInstant();
Duration duration = Duration.between(departingInstant, arrivingInstant);
Run Code Online (Sandbox Code Playgroud)
另外,由于Duration.between
对作品Temporal
的对象,都Instant
和ZonedDateTime
实施Temporal
,你可以打电话Duration.between
直接在ZonedDateTime
对象:
Duration duration = Duration.between(berlinDateTime, losDateTime2);
Run Code Online (Sandbox Code Playgroud)
最后,如果您希望直接获得一个度量单位(例如总秒数),那么像atao提到的那些快捷方式就可以了.任何这些都是可以接受的.
更换:
int offsetInSeconds = berlinDateTime.getOffset().getTotalSeconds();
int offsetInSeconds2 = losDateTime2.getOffset().getTotalSeconds();
Duration duration = Duration.ofSeconds(offsetInSeconds - offsetInSeconds2);
Run Code Online (Sandbox Code Playgroud)
有:
long seconds = ChronoUnit.SECONDS.between(berlinDateTime, losDateTime2);
Duration duration = Duration.ofSeconds(seconds);
Run Code Online (Sandbox Code Playgroud)
编辑
我喜欢Matt Johnson给出的更短(也是最短)的答案:
Duration duration = Duration.between(berlinDateTime, losDateTime2);
Run Code Online (Sandbox Code Playgroud)