首页 > 解决方案 > 将任何时区中的 LocalDateTime 转换为 Java 中的任何时区

问题描述

所需输出:2020-08-14T10:11 //表示 2020 年 8 月 14 日星期五上午 10:11

如果LocalDateTime来自任何区域,则将相应地获得 UTC 时间相对于任何时区时间的 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();

标签: javajava-time

解决方案


我建议不要LocalDateTime在时区的日期和时间使用 for。ZonedDateTime是那个类。ALocalDateTime正好是没有时区的日期和时间。

    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 会跟踪每个日期和时间对象的时区,这使得在转换中出错变得相当困难。一个难以高估的优势。


推荐阅读