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

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

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

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

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

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

解决方法

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

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

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

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

ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

UTC 是一个真实的时间

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

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

应该只需要一个时区:

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

顺便说一下,该属性 user.timezone 在 Java 11 中并未列为 standard default properties 之一。

,

我非常同意 Basil Bourque 的回答:您的解决方案是编写代码,使其独立于 JVM 默认时区。同样如评论中所述,当通过 JDBC 4.2(或更高版本)在 SQL 数据库中使用 java.time 类型时,没有默认时区干扰。

此外,从我读过的内容来看,驱动程序倾向于使用数据库会话时区,而不是 JVM 默认时区。您可能需要搜索数据库文档和 JDBC 驱动程序文档以了解控制会话时区的方法。

但是要回答你的问题:

    String userTimezoneProp = System.getProperty("user.timezone");
    boolean timezonePropertyEmpty = userTimezoneProp == null || userTimezoneProp.isEmpty();
    if (timezonePropertyEmpty) {
        System.err.println("You must set the user.timezone property to the same time zone as the database time zone.");
        System.exit(-1);
    }

只有您必须在执行任何使用默认时区的操作之前执行此操作。一旦执行了这样的操作,JVM 将查询操作系统的默认时区并相应地设置系统属性(如果成功)。

根据文档,System.getProperty() 应该为尚未设置的系统属性返回 null。在这个例子中,我的 Java 返回了一个空字符串。所以我考虑了这两种可能性。对于 user.timezone 来说,它可能有些特别。我没有找到任何提及它的文档。我仍然不保证该方法是防弹的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?