我得到一个纪元格式的数字。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
*/
然而,这对我来说似乎是一个糟糕的解决方案(只是一种预感)。我想知道是否有比生成字符串并解析它更好的方法?
HUX布斯
相关分类