为什么不按时区转换时间?

bqujaahr  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(378)

我有localdatetime,它以utc为单位保存值。我想根据时区把它转换成当地的日期和时间,
我是这样做的:

public LocalDateTime convertUTC2LocalDateTimeZone(LocalDateTime dateTime){

    System.out.println("dateTime:" + dateTime);

    ZonedDateTime zonedDateTime = dateTime.atZone(ZoneId.of("Canada/Mountain"));        
    System.out.println("zonedDateTime:" + zonedDateTime);

    LocalDateTime ldt = zonedDateTime.toLocalDateTime()     
    System.out.println("ldt:" + ldt);

    return ldt;
}

输出:

dateTime:2018-07-15T10:00:46
zonedDateTime:2018-07-15T10:00:46-06:00[Canada/Mountain]
ldt:2018-07-15T10:00:46

如您所见,ldt值与输入值相同,没有发生时间转换。你知道为什么时间转换没有发生吗?

q35jwt9p

q35jwt9p1#

LocalDateTime 表示“本地时间和日期”。换句话说:它是一种抽象的东西,比如“2020年1月1日上午10:00”,没有任何时区信息。
它不代表utc中的任何内容。里面根本没有时区信息。
所以它并不代表一个“物理”或确切的时间点。为此,您需要将其转换为 ZonedDateTime 通过添加一些时区。你在代码中的做法基本上是:“给我一个 ZonedDateTime 对象,该对象表示此服务器提供的本地时间 LocalDateTime 在给定的时区”。
就是这个意思 ZonedDateTime 表示一个固定的时间点(也就是说,基本上,你可以计算从epoch开始的毫秒数)。
然后你问“既然如此 ZonedDateTime ,本地日期/时间是多少?”,它只返回您最初输入的值,不做任何修改。
要真正从utc转换到其他时区,您需要显式地创建一个 ZonedDateTime 首先在utc时区:
创建 ZonedDateTime 代表utc
计算 ZonedDateTime 在目标时区
得到一个 LocalDateTimeZonedDateTime 创建于#2。
所以在代码中:

ZonedDateTime utcDateTime = dateTime.atZone(ZoneOffset.UTC);   // #1
ZonedDateTime mountainDateTime = utcDateTime.withZoneSameInstant(ZoneId.of("Canada/Mountain"));   // #2
LocalDateTime localDateTimeAtMountain = mountainDateTime.toLocalDateTime();  // #3

相关问题