为了账号安全,请及时绑定邮箱和手机立即绑定

在时区之间转换纪元毫秒

在时区之间转换纪元毫秒

侃侃尔雅 2023-06-04 14:57:04
我得到一个纪元格式的数字。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]


查看完整回答
反对 回复 2023-06-04
  • 1 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信