我得到一个纪元格式的数字。Epoch 应该在 UTC 中,但我在 PST 时区中获取它。所以我必须修复这个值。我该怎么做?我最初尝试的是: // This number represents Tuesday, July 30, 2019 1:53:19 AM UTC, // but it's supposed to represent PST. // The actual PST value for this date is going to be 1564476799000 // which is the same as Tuesday, July 30, 2019 8:53:19 AM UTC. // So I need to "pretend" that this value is actually PST // and adjust it accordingly (including DST and friends). Long testDateLong = 1564451599000L; // These correctly assume that the instant is in UTC and adjust it to PST // which is not the real intention LocalDateTime pstL = LocalDateTime.ofInstant(Instant.ofEpochMilli(testDateLong), ZoneId.of("America/Los_Angeles")); ZonedDateTime pstZ = ZonedDateTime.ofInstant(Instant.ofEpochMilli(testDateLong), ZoneId.of("America/Los_Angeles")); System.out.println(pstL); System.out.println(pstZ); /* * Output: * * 2019-07-29T18:53:19 * 2019-07-29T18:53:19-07:00[America/Los_Angeles] * * Expected to see: * * 2019-07-30T01:53:19 * 2019-07-30T01:53:19-07:00[America/Los_Angeles] * */可行的解决方案是将 epoch 值格式化为 UTC 格式的字符串,然后使用 PST 时区对其进行解析,如下所示: Long testDateLong = 1564451599000L; DateTimeFormatter formatterUTC = DateTimeFormatter .ofLocalizedDateTime(FormatStyle.SHORT) .withZone(ZoneId.of("Etc/UTC")); DateTimeFormatter formatterPST = DateTimeFormatter .ofLocalizedDateTime(FormatStyle.SHORT) .withZone(ZoneId.of("America/Los_Angeles")); String utcString = formatterUTC.format(Instant.ofEpochMilli(testDateLong)); Instant instant = Instant.from(formatterPST.parse(utcString)); System.out.println(utcString); System.out.println(instant); System.out.println(instant.toEpochMilli()); /* * Output: * * 7/30/19 1:53 AM * 2019-07-30T08:53:00Z * 1564476780000 */然而,这对我来说似乎是一个糟糕的解决方案(只是一种预感)。我想知道是否有比生成字符串并解析它更好的方法?
1 回答
HUX布斯
TA贡献1876条经验 获得超6个赞
您可以使用UTC区域进行解析,然后更改Zone
long testDateLong = 1564451599000L;
Instant ist = Instant.ofEpochMilli(testDateLong);
ZoneId zUTC = ZoneId.of("UTC");
ZoneId zLA = ZoneId.of("America/Los_Angeles");
ZonedDateTime zdt1 = LocalDateTime.ofInstant(ist, zUTC).atZone(zLA);
ZonedDateTime zdt2 = ZonedDateTime.ofInstant(ist, zUTC).withZoneSameLocal(zLA);
System.out.println(zdt1); // 2019-07-30T01:53:19-07:00[America/Los_Angeles]
System.out.println(zdt2); // 2019-07-30T01:53:19-07:00[America/Los_Angeles]
添加回答
举报
0/150
提交
取消