在时区之间转换纪元毫秒

我得到一个纪元格式的数字。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

   */

然而,这对我来说似乎是一个糟糕的解决方案(只是一种预感)。我想知道是否有比生成字符串并解析它更好的方法?


侃侃尔雅
浏览 83回答 1
1回答

HUX布斯

您可以使用UTC区域进行解析,然后更改Zonelong 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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java