[英]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.