java – 从秒开始获取LocalDateTime,包括时区
我有时间在几秒钟内从我们的计算机“第0天”(1970年1月1日午夜时分),我想将其转换为LocalDateTime实例.这段代码会这样做:
LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds,ZoneOffset.UTC) 不过,我需要这个LocalDateTime在我的时区.将ZoneOffset.UTC更改为ZineOffset.of(“2”将使LocalDateTime显示正确的时间.(对于,我们说巴黎截至2015年8月31日) 但这或多或少是一种不完美的解决方法,因为它不会照顾夏令时. 所以我尝试了一下,找到了ZonedDateTime类.它也没有帮助我,但我被困在这里: LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(seconds,ZoneOffset.UTC); ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime,ZoneId.systemDefault()); 这根本不起作用,因为ZonedDateTime包含一个LocalDateTime,然后包含一个LocalTime,这是我在UTC时间,而不是在我当前的时区. 那么如何从(优选地)系统时区获得一个LocalDateTime,包括夏令时(如果需要),从UTC秒到epoche值? 解决方法
您需要指定ZoneId,以便考虑到地理区域的夏令时.获取可用区域ID列表:
System.out.println(ZoneId.getAvailableZoneIds()); 使用正确的区域ID,您将可以访问夏令时规则. 例如,在德国(UTC 1),他们在1940年(UTC 2)进行了第一次夏令时. 1947年,他们引入了仲夏时间,比标准冬季时间(= UTC 3)提前了两个小时.以下是1940年夏季,1947年,1970年(没有夏令时)和今天早上的例子: Instant[] instants = new Instant[] { LocalDateTime.of(1939,6,1,0).toInstant(ZoneOffset.UTC),LocalDateTime.of(1940,LocalDateTime.of(1947,Instant.ofEpochSecond(0),// 1970-01-01T00:00:00 UTC LocalDateTime.of(1970,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(); } 这将打印如下: 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 如您所见,规则正确实施.柏林的第一次夏令时是1940年.1947年,夏令时又增加了一小时.在1950年至1980年期间,根本没有夏令时. 1980年,欧洲许多国家都有一个精心策划的夏令时开始. 哦,回答你的问题: LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds),ZoneId.systemDefault()) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |