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
,那么你想要两件事:
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
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
我们正在将 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
,那么你想要两件事:
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
相同
- 在 UTC 中,这与
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
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