我在Windows机器上使用Java 7。我正在开发一个在Tomcat上运行的Web应用程序。
我需要知道服务器的时区。以下是我为此目的所做的事情:
TimeZone.getDefault();
这是正确的方法吗?
感谢您的投入!
问候。
答案 0 :(得分:0)
TimeZone.getDefault()
这是正确的方法吗?
不,该课程现已成为遗产,由ZoneId
取代。
ZoneId.systemDefault()
但如果指定所需/预期的区域而不是依赖JVM的当前默认区域,则会更好。
现代解决方案使用 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" ) ) ;
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
顺便说一句,Locale
同上 - 始终明确指定而不是隐含地依赖当前默认值。
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类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。