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

时间:2019-07-09 10:53:33

标签: java date timezone localdate

我正在创建一个日期并将其存储到数据库中,我想获取当前时间,即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

我希望创建日期时像亚洲/伊斯坦布尔那样。

1 个答案:

答案 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。