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