我有时间在几秒钟内从我们的计算机"第0天"(又名1970年1月1日午夜),我想将其转换为LocalDateTime实例.这段代码会这样做:
LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC)
Run Code Online (Sandbox Code Playgroud)
不过,我需要这个LocalDateTime在我的时区.更改ZoneOffset.UTC为ZineOffset.of("+2)将使LocalDateTime显示正确的时间.(对于,我们说巴黎截至2015年8月31日)
但这或多或少是一种不完美的解决方法,因为它不会照顾夏令时.
所以我尝试了一下,找到了ZonedDateTime课程.它也没有帮助我,但我被困在这里:
LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime,ZoneId.systemDefault());
Run Code Online (Sandbox Code Playgroud)
这根本不起作用,因为ZonedDateTime包含一个LocalDateTime然后包含LocalTime我在UTC中的时间,而不是在我当前的时区.
那么你如何LocalDateTime从(优选的)系统时区中获得一个UTC时间段(如果需要),从UTC秒到epoche值?
您需要指定ZoneId以便从地理区域考虑夏令时.获取可用区域ID列表:
System.out.println(ZoneId.getAvailableZoneIds());
Run Code Online (Sandbox Code Playgroud)
使用正确的区域ID,您将可以访问夏令时规则.
例如,在德国(UTC + 1),他们在1940年首次采用了夏令时(UTC + 2).1947年,他们介绍了夏季中期,比标准冬季时间早两个小时(= UTC + 3).以下是1940年夏季,1947年,1970年(没有夏令时)和今天早上的例子:
Instant[] instants = new Instant[] {
LocalDateTime.of(1939, 6, 1, 0, 0).toInstant(ZoneOffset.UTC),
LocalDateTime.of(1940, 6, 1, 0, 0).toInstant(ZoneOffset.UTC),
LocalDateTime.of(1947, 6, 1, 0, 0).toInstant(ZoneOffset.UTC),
Instant.ofEpochSecond(0), // 1970-01-01T00:00:00 UTC
LocalDateTime.of(1970, 6, 1, 0, 0).toInstant(ZoneOffset.UTC),
Instant.now().truncatedTo(ChronoUnit.DAYS), // 2015-08-31T00:00:00 UTC
};
for (Instant instant : instants) {
LocalDateTime inBerlin = LocalDateTime.ofInstant(instant, ZoneId.of("Europe/Berlin"));
System.out.println("UTC " + instant.atOffset(ZoneOffset.UTC).toLocalDateTime());
System.out.println("BERLIN " + inBerlin);
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
这将打印如下:
UTC 1939-06-01T00:00
BERLIN 1939-06-01T01:00
UTC 1940-06-01T00:00
BERLIN 1940-06-01T02:00
UTC 1947-06-01T00:00
BERLIN 1947-06-01T03:00
UTC 1970-01-01T00:00
BERLIN 1970-01-01T01:00
UTC 1970-06-01T00:00
BERLIN 1970-06-01T01:00
UTC 2015-08-31T00:00
BERLIN 2015-08-31T02:00
Run Code Online (Sandbox Code Playgroud)
如您所见,规则正确实施.柏林的第一次夏令时是1940年.1947年,夏令时又增加了一小时.在1950年至1980年期间,根本没有夏令时.1980年,欧洲许多国家都有一个精心策划的夏令时开始.
哦,回答你的问题:
LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), ZoneId.systemDefault())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5147 次 |
| 最近记录: |