【问题标题】:UTC to local method in DateTimeZone of Joda-Time to Java 8UTC 到 Joda-Time 到 Java 8 的 DateTimeZone 中的本地方法
【发布时间】:2017-08-09 07:29:09
【问题描述】:

我们正在将 Joda-Time API 更改为 Java 8 time API。在 Joda-Time 我使用过:

DateTimeZone.convertLocalToUTC(this.getMillis(), true);
DateTimeZone.convertUTCToLocal(long millis);

谁能告诉我 Java 8 中的等效方法?

已编辑

convertLocalToUTC

DateTimeZone dateTimeZone = DateTimeZone.getDefault();
DateTime jodadatetime = new DateTime();
long utcTime = dateTimeZone.convertLocalToUTC(jodadatetime .getMillis(), true);
System.out.println(jodadatetime);

DateTimeZone dateTimeZone1 = DateTimeZone.UTC;
System.out.println(new DateTime(utcTime, dateTimeZone1));

输出

2017-08-09T17:27:57.508+05:30
2017-08-09T06:27:57.508Z

ConvertUtcToLocal

long utctolocal = dateTimeZone.convertUTCToLocal(jodadatetime.getMillis());
System.out.println("utc to local : " + new DateTime(utctolocal, dateTimeZone1));

输出

2017-08-09T17:27:57.508Z

【问题讨论】:

  • convertUTCToLocallong 作为参数,而不是DateTimeZone。还是我错过了什么?
  • @Hugo 对不起我的错误
  • 默认时区是多少?
  • @Hugo [亚洲/加尔各答]

标签: java-8 jodatime java-time


【解决方案1】:

所以,你原来的日期是2017-08-09T17:27:57.508+05:30,那么你想要两件事:

  1. convertLocalToUTC:获取2017-08-09T06:27:57.508Z。这有点棘手:

原始日期为2017-08-09T17:27:57.508+05:30,在UTC 中相当于2017-08-09T11:57:57.508Z。此方法的作用是将其转换为相同的本地日期和时间,但在加尔各答时区,然后以 UTC 打印。简而言之:

  • 原始日期是2017-08-09T17:27:57.508+05:30
    • 在 UTC 中,与 2017-08-09T11:57:57.508Z 相同
  • convertLocalToUTC 将其转换为 2017-08-09T11:57:57.508+05:30(相同的日期和时间,但在加尔各答时区)
    • 2017-08-09T06:27:57.508Z一样

要在 Java 8 中执行此操作,您可以:

ZoneId zone = ZoneId.of("Asia/Calcutta");
// original date 2017-08-09T17:27:57.508+05:30
Instant i = OffsetDateTime.parse("2017-08-09T17:27:57.508+05:30")
    // convert to UTC (2017-08-09T11:57:57.508Z)
    .atZoneSameInstant(ZoneOffset.UTC)
    // convert to same local time in Calcutta
    .withZoneSameLocal(zone)
    // back to UTC
    .toInstant();
System.out.println(i.toEpochMilli() + "=" + i);

输出:

1502260077508=2017-08-09T06:27:57.508Z

  1. convertUTCToLocal:获取 2017-08-09T17:27:57.508Z - 相同的日期 (2017-08-09) 和时间 (17:27:57.508),但采用 UTC。

类似:

ZoneId zone = ZoneId.of("Asia/Calcutta");
// original date 2017-08-09T17:27:57.508+05:30
ZonedDateTime z = OffsetDateTime.parse("2017-08-09T17:27:57.508+05:30")
    // convert to a ZonedDateTime in Calcutta (2017-08-09T17:27:57.508+05:30[Asia/Calcutta])
    .atZoneSameInstant(zone)
    // convert to same local time in UTC
    .withZoneSameLocal(ZoneOffset.UTC);
System.out.println(z.toInstant().toEpochMilli() + "=" + z);

输出:

1502299677508=2017-08-09T17:27:57.508Z


您还可以从毫秒值中获取日期。

对于案例 1:

// millis for original joda date: jodadatetime.getMillis() (1502279877508 = 2017-08-09T17:27:57.508+05:30)
long millisFromJoda = 1502279877508L;
Instant instant = Instant.ofEpochMilli(millisFromJoda)
    // convert to UTC (2017-08-09T11:57:57.508Z)
    .atZone(ZoneOffset.UTC)
    // convert to same local time in Calcutta
    .withZoneSameLocal(zone)
    // back to UTC
    .toInstant();
System.out.println(instant.toEpochMilli() + "=" + instant);

输出:

1502260077508=2017-08-09T06:27:57.508Z

如果需要,您可以将Instant 转换为其他类型:

// convert to ZonedDateTime in UTC
ZonedDateTime zd = instant.atZone(ZoneOffset.UTC);
// convert to OffsetDateTime in UTC
OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC);

两者都是2017-08-09T06:27:57.508Z

对于案例 2:

ZonedDateTime zdt = Instant.ofEpochMilli(millisFromJoda)
    // convert to a ZonedDateTime in Calcutta (2017-08-09T17:27:57.508+05:30[Asia/Calcutta])
    .atZone(zone)
    // convert to same local time in UTC
    .withZoneSameLocal(ZoneOffset.UTC);
System.out.println(zdt.toInstant().toEpochMilli() + "=" + zdt);

输出:

1502299677508=2017-08-09T17:27:57.508Z

【讨论】:

  • 对于带有毫秒的案例 1,我想要 ZonedDatetime/OffsetDateTime 而不是即时。当我尝试将瞬间更改为 Zoned/OffsetDateTime 时,时间正在改变
【解决方案2】:

这里有一些可以帮助你入门的代码 sn-p:

LocalDateTime yourLocalTime = ...
long utc = yourLocalTime.toInstant(ZoneOffset.UTC).toEpochMilli();

或者你使用strict = true 如下:

long utc = ZonedDateTime.ofStrict(yourLocalTime, ZoneOffset.UTC, ZoneId.of("Z")).toInstant().toEpochMilli();

转换回来类似:

LocalDateTime yourUtcTime = ...
long localTimeInMillis = yourUtcTime.toInstant(OffsetDateTime.now().getOffset() /* or: yourLocalTime.getOffset() */).toEpochMilli();

如果您不需要millis,但想改用DateTime 类,您可能想改用ZonedDateTime

从millis创建LocalDateTime可以如下完成:

LocalDateTime yourLocalDateTime = Instant.ofEpochMilli(millisAsLong).atZone(/* your desired zone here */).toLocalDateTime();

其中区域 ID 可以是 ZoneId.of("Z")ZoneId.systemDefault() 等。

【讨论】:

  • 在我的代码中 LocaltoUtc 转换给出了 2017-08-09T06:50:15.644Z 但我使用了您的代码 ZonedDateTime.ofStrict(yourLocalTime, ZoneOffset.UTC, ZoneId.of("Z")) 它给出了 2017-08-09T17:50:15.582Z
猜你喜欢
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 2013-03-14
  • 2013-02-15
相关资源
最近更新 更多