所以,你原来的日期是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