如何使用Java获取OS X的时区信息?

时间:2011-08-26 05:05:07

标签: java timezone macos

如何使用Java获取Mac OS X上的时区信息?

2 个答案:

答案 0 :(得分:3)

TimeZone类用于Java中的时区。要获取系统的默认时区,可以使用静态getDefault方法。

答案 1 :(得分:1)

tl; dr

ZoneId
.of( "Africa/Tunis" ) 
.getRules()
.isDaylightSavings​( 
    Instant.now() 
)

java.time

现代解决方案使用 java.time 类代替了可怕的旧式日期时间类:ZoneIdZoneOffsetZoneRules

您问:

如何使用Java在Mac OS X上获取时区信息?

在Mac上通过Java获取时区信息的方式与在任何其他主机OS上一样。

ZoneId

定义感兴趣的时区。以Continent/Region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。千万不要使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;

ZoneRules

获取该区域的规则。这些规则包括该特定区域的人们过去,现在和将来对偏移量的更改历史。

ZoneRules rules = z.getRules() ;

询问在任何特定时刻有效的规则。让我们在演示中使用当前时刻。

Instant instant = Instant.now() ;  // Capture the current moment.

ZoneOffset

获取当前在该区域中使用的偏移量。偏移量只是UTC(本初子午线)之前或之后的小时-分钟-秒数。

ZoneOffset offset = rules.getOffset( instant ) ;

夏令时(DST)

询问当时该区域中的夏令时(DST)是否有效。

boolean isDst = rules.isDaylightSavings​( instant ) ;

您还可以要求该区域中的上一个和下一个过渡,以及更多。

tzdata

请注意,macOS拥有自己的tzdata数据副本,用于定义时区。 Apple的操作系统更新包括新副本。如果您感兴趣的区域正在变化,请确保您是最新的。此macOS副本会影响大多数不基于Java的应用程序。

Java Virtual Machine (JVM)包含自己的 tzdata 。同样,如果您感兴趣的时区在变化,请确保您使用的所有JVM都已更新。 Java更新包括新鲜的 tzdata 。但是政客们真的很喜欢改变时区,通常很少或根本没有预警。因此,您可能需要手动更新JVM的 tzdata 文件。并且请确保更新已安装的所有JVM,以及与正在使用的任何基于Java的应用程序捆绑在一起的所有JVM。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规范为JSR 310

Joda-Time项目(现在位于maintenance mode中)建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。 Hibernate 5和JPA 2.2支持 java.time

在哪里获取java.time类?