繁体   English   中英

如何获取和格式化带时区的日期

[英]how to get and format date with timezone

我正在创建一个日期并将其存储到数据库中,我想获取当前时间,即timezone =“ Asia / Istanbul”而不是我的本地时间。

我正在本地计算机上创建日期,本地时区也为“亚洲/伊斯坦布尔”。

当我将其部署到服务器中时,服务器时区为utc,每次都转向utc。

我有不同的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

我预计创建日期时会像亚洲/伊斯坦布尔那样。

我根本不会使用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小时。 因此显示的时间点等于UTC的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它的no-arg方法使用JVM的时区设置(在本例中为UTC),因此在有问题的日期为您提供10:30。 我认为ZonedDateTime.of在这里是错误的:它从LocalDateTime获取10:30,在ZoneId对象中获取İstanbul时区,并在İstanbul中提供10:30,这不是您想要的。 您想要13:30,又叫1:30 PM。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM