UTC 到 Joda-Time 的 DateTimeZone 中的本地方法到 Java 8

UTC to local method in DateTimeZone of Joda-Time to Java 8

我们正在将 Joda-Time API 更改为 Java 8 时间 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

下面是一些可以帮助您入门的代码片段:

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();

如果您不需要毫秒,但想使用 DateTime-类,您可能需要使用 ZonedDateTime

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

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

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

那么,你的原始日期是 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