问题描述
- 假设我的
LocalDateTime
位于IST,即(2020-08-14T15:41) - 需要将此IST
LocalDateTime
转换为任何时区,例如IST转换为UTC
要求的输出:2020-08-14T10:11 //表示上午10:11 2020年8月14日,星期五
如果来自任何时区的任何LocalDateTime
,那么将获得相对于任何时区时间的UTC时间。
获得了将LocalDateTime从任何时区转换为任何时区的通用解决方案:
LocalDateTime localDateTimeOfFromTimeZone = LocalDateTime.Now();//it's takes your default application LocalDateTime
System.out.println("From LocalDateTime : "+localDateTimeOfFromTimeZone);
zoneddatetime fromTimezoneddatetime = localDateTimeOfFromTimeZone.atZone(fromTimeZoneId);
LocalDateTime localDateTimeOfToTimeZone = LocalDateTime.from(fromTimezoneddatetime.withZonesameInstant(toTimeZoneId));
System.out.println("Converted To LocalDateTime :"+localDateTimeOfToTimeZone);
或
LocalDateTime newDateTime = oldDateTime.atZone(oldZone).withZonesameInstant(newZone).toLocalDateTime();
解决方法
我建议不要在时区中的日期和时间使用LocalDateTime
。 ZonedDateTime
是该类。 LocalDateTime
恰好是日期和时间没有时区。
ZoneId fromTimeZoneId = ZoneId.of("Asia/Kolkata");
ZoneId toTimeZoneId = ZoneId.of("Etc/UTC");
ZonedDateTime dateTimeOfFromTimeZone = ZonedDateTime.now(fromTimeZoneId);
System.out.println("From ZonedDateTime: " + dateTimeOfFromTimeZone);
ZonedDateTime dateTimeOfToTimeZone
= dateTimeOfFromTimeZone.withZoneSameInstant(toTimeZoneId);
System.out.println("Converted To ZonedDateTime: " + dateTimeOfToTimeZone);
我刚才运行代码时的输出:
From ZonedDateTime: 2020-08-15T00:13:19.519646+05:30[Asia/Kolkata] Converted To ZonedDateTime: 2020-08-14T18:43:19.519646Z[Etc/UTC]
使用ZonedDateTime
而不是LocalDateTime
时,Java会跟踪每个日期和时间对象的时区,这使得在转换中犯错误变得相当困难。难以估量的优势。