我在 Windows 机器上使用 Java 7。我正在开发一个在 Tomcat 上运行的网络应用程序。
我需要知道服务器的时区。这是我为此目的所做的:
TimeZone.getDefault();
这是正确的方法吗?
感谢您的意见!
问候。
最佳答案
tl;dr
TimeZone.getDefault()
Is this the correct way?
不,那个类现在是遗留的,被 ZoneId
取代了.
ZoneId.systemDefault()
但如果您指定所需/预期的区域而不是依赖 JVM 当前的默认值,则更好。
java.time
现代解决方案使用 java.time 类(ZoneId
、ZoneOffset
和 ZoneRules
),而不是麻烦的旧旧日期时间类 (TimeZone
)。
当前默认值
您可以询问 JVM 当前的默认时区。
ZoneId z = ZoneId.systemDefault() ;
但无论您有什么目的,都可能是不明智的。首先,服务器的最佳实践是将主机操作系统和 JVM 的默认时区设置为 UTC。其次,你永远不应该依赖于服务器的时区。作为程序员,该设置不受您的控制,并且很容易更改为意外值。在 JVM 中,该 JVM 中任何应用程序的任何线程中的任何代码都可能在运行时更改当前默认时区。
指定区域
最好始终通过将可选参数传递给各种 java.time 方法来指定您想要/期望的时区。
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "Africa/Tunis" ) ) ;
指定 proper time zone name格式为continent/region
,如America/Montreal
, Africa/Casablanca
,或 太平洋/奥克兰
。切勿使用 3-4 个字母的缩写,例如 EST
或 IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
顺便说一句,Locale
也是如此——始终明确指定而不是隐含地依赖当前默认值。
关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。
要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .
您可以直接与您的数据库交换java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.*
类。
从哪里获得 java.time 类?
- Java SE 8 , Java SE 9 , 然后
- 内置。
- 带有捆绑实现的标准 Java API 的一部分。
- Java 9 添加了一些次要功能和修复。
- Java SE 6和 Java SE 7
- 许多 java.time 功能在 ThreeTen-Backport 中被反向移植到 Java 6 和 7 .
- Android
- 更高版本的 Android 捆绑了 java.time 类的实现。
- 对于早期的 Android,ThreeTenABP项目适应 ThreeTen-Backport(如上所述)。参见 How to use ThreeTenABP… .
ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
, 和 more .
关于java - 如何获取Java服务器的时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15846214/