如何确保显式指定java系统属性`user.timezone`?

Sur*_*yan 2 java timezone system-properties

我想确保我的 Java 程序始终由显式指定的user.timezone属性运行。我-Duser.timezone=XXX作为命令行设置传递。

但是,当我完全省略该系统属性,然后在我的程序中检查 的值时System.getProperty("user.timezone"),它不是null,而是包含系统时区。因此,我无法终止我的程序,因为该属性的值永远不会为空。

我知道我可以使用自定义系统属性名称(比如tz)来接受时区 ID,然后TimeZone.setDefault(System.getProperty("tz"))在我的代码中执行,但我更喜欢使用系统属性user.timezone,它旨在用于这个原因。

有什么方法可以使用user.timezone系统属性来实现我所需要的吗?

Bas*_*que 6

明确指定时区作为方法调用的参数

依赖 JVM 的当前默认时区本质上是不可靠的。JVM 中任何应用程序的任何线程中的任何代码都可以随时通过调用TimeZone.setDefault. 这样的调用会立即影响依赖该默认值的所有其他代码。

相反,始终明确指定您希望/期望的时区。

此外,TimeZone已过时,多年前被JSR 310 中定义的现代java.time类取代。具体来说,ZoneIdZoneOffset. 您可以将这些类的对象作为可选参数传递给所有相关方法。

ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
Run Code Online (Sandbox Code Playgroud)

UTC 是唯一的真实时间

在服务器上,通常最佳做法是将主机操作系统和 JVM 的默认时区设置为 UTC(与 UTC 的偏移量为零)。

并且您的大部分业务逻辑、日志记录和调试也都应该使用 UTC。

只需要一个时区:

  • 当本地化显示给用户时。
  • 特定业务规则要求的地方。

顺便说一句,该属性user.timezone并未列为Java 11中的标准默认属性之一。

  • @SurenAznauryan实际上,在服务器上,通常最好的主动措施是将主机操作系统和JVM的默认时区设置为UTC(与UTC的偏移量为零)。大多数业务逻辑、日志记录和调试也都应该采用 UTC。仅应在向用户本地化显示以及特定业务规则需要时才涉及时区。因此,您的代码库中不应该有很多地方会忘记时区。 (2认同)