我正在创建一个日期并将其存储到数据库中,我想获取当前时间,即timezone =“ Asia / Istanbul”而不是我的本地时间。
我正在本地计算机上创建日期,我的本地时区也是“亚洲/伊斯坦布尔”。
当我将其部署到服务器中时,服务器时区为utc,每次都转向utc。
我有2台计算机,而2台计算机有不同的时区,所以我需要用时区设置数据日期。
这是我所做的。在我的本地计算机上可以,但是在UTC服务器上失败
LocalDateTime localDateTime = LocalDateTime.now();
// it gives my local date time, 2019-07-09T10:30:03.171
// local date is now 1:30 pm, UTC is 3 hours after, it looks ok.
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("Asia/Istanbul"));
//2019-07-09T10:30:03.171+03:00[Asia/Istanbul]
// it looks +3. I dont want to see +3, I want the date like 01:30 which is shiefted
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
zonedDateTime.format(formatter);
//2019-07-09T07:30:03.171Z
// zone is disappeared, this is 3 hours before UTC
我希望创建日期时像亚洲/伊斯坦布尔那样。
答案 0 :(得分:2)
我完全不会使用LocalDateTime
。始终使用ZonedDateTime
来消除对时间的任何怀疑。还要始终将ZoneId
(如果不是Clock
)传递给now
方法。这使您的代码独立于计算机和JVM的时区设置。
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Istanbul"));
System.out.println(zonedDateTime);
2019-07-09T14:14:17.280852 + 03:00 [亚洲/伊斯坦布尔]
您有时可能会误解了+03:00
部分。这意味着显示的时间已经比UTC早3小时。因此显示的时间点等于世界标准时间11:14:17。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(zonedDateTime.format(formatter));
2019-07-09 14:14:17
您的格式化程序不包含时区,因此未显示。但这是在伊斯坦布尔的时间。
我假设您代码中的注释来自UTC服务器上运行的代码(尚不十分清楚),并且您在10:30 UTC附近运行了代码,与伊斯坦布尔的13:30相同。
LocalDateTime
是没有时区且没有UTC偏移的日期和时间。它的无参数now
方法使用JVM的时区设置(在本例中为UTC),因此在相关日期为您提供10:30。我认为ZonedDateTime.of
在这里是错误的:它将LocalDateTime
中的10:30移到ZoneId
对象中的伊斯坦布尔时区,并在伊斯坦布尔给了10:30,这不是事实你自找的。您想要的时间是13:30,又叫下午1:30。