【问题标题】:Fetching manually set Timezone on Windows machine在 Windows 机器上获取手动设置时区
【发布时间】:2019-04-24 17:04:54
【问题描述】:

我希望能够获取我的机器设置的任何时区,而无需在代码中手动指定时区。我可能不在那个时区,但目标是使用计算机设置的时区。

我的时区区域是 America/New_York,使用 ZoneId.systemDefault() (EDT)。但是,我已将计算机的时区设置为太平洋时间 (PDT)。我已经尝试了下面指定的代码。在 Java 8 中实现这一目标的最佳方法是什么?

LocalDateTime currentDateTime = LocalDateTime.of(date.getYear(), date.getMonth(), date.getDay(), hour, minute, 0);
        ZonedDateTime zonedDateTime = currentDateTime.atZone(ZoneId.systemDefault());
        date = Date.from(zonedDateTime.toInstant());

我希望时区是 Amrica/Dawson 或 America/Tijuana (UTC -08:00),但我得到的是 America/New_York (UTC -05:00)

【问题讨论】:

  • 我更感兴趣的是,当现在是夏令时时,您是如何获得 -05:00[America/New_York] 的(我获得的是 -04:00[America/New_York])。
  • Calendar.getInstance().getTimezone()?
  • 在 Centos 7 上使用 timedatectl,更改系统时区让我得到了预期的结果,所以我猜你尝试更改系统时区的方式并没有按照你的想法进行
  • @markspace 已经试过了。不过还是谢谢。
  • @Matt 嗨。你以什么方式改变你的时区?我已经使用 Windows 设置的“日期和时间”>“更改时区”进行了更改。

标签: java java-8


【解决方案1】:

这是我为得到答案而编写的完整代码:

TimeZone.setDefault(null);
System.setProperty("user.timezone", "");
//(above) force fetches and sets the JVM to the timezone the system is set to
LocalDateTime currentDateTime = LocalDateTime.of(date.getYear(), date.getMonth(), date.getDay(), hour, minute, 0);
ZonedDateTime zonedDateTime = currentDateTime.atZone(ZoneId.systemDefault());
date = Date.from(zonedDateTime.toInstant());

问题是我可能已经更改了@Matt 提到的系统时区。但是,我发现尽管手动更改了时区,但 JVM 时间并没有改变。

TimeZone.setDefault(null);
System.setProperty("user.timezone", "");

(上)允许我清除之前设置的 JVM 时区。

编辑 04/26/2019

我更新了我的逻辑以支持太平洋时间的夏令时。我遇到了一个问题,我的时间是设置 PST 而不是 PDT,所以我没有使用上述逻辑,而是将其更改为获取区域 ID 并将其与 Calendar 类一起使用。下面是完整的逻辑:

TimeZone.setDefault(null);
System.clearProperty​("user.timezone"); //04/26/2019 EDIT This was suggested as a cleaner way of clearing the user timezone in the system.
//(above) force fetches and sets the JVM to the timezone the system is set to
System.out.println("Zone: "+ZoneId.systemDefault()+" isDaylightsavings? "+ZoneId.systemDefault().getRules().isDaylightSavings(Instant.now())+" currentDateTime: "+currentDateTime);
String timeZone = ""+ZoneId.systemDefault();
Calendar selectedDate = Calendar.getInstance(TimeZone.getTimeZone(timeZone)); // important when it comes to determining PDT or PST
date = selectedDate.getTime();

【讨论】:

  • 我认为,System.clearProperty​("user.timezone"); 会比 System.setProperty("user.timezone", ""); 更干净...
  • @Holger 你能解释一下优点吗?
  • 它记录了意图:您想要清除属性(删除显式设置)而不是将其设置为空字符串。与将映射保存到空字符串相比,没有映射也可能会节省一点内存,但这可以忽略不计。
  • @Holger 谢谢!对于阅读本文的每个人来说,这是一件好事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 2014-02-12
相关资源
最近更新 更多