具有自定义ID的Java TimeZone不考虑夏令时

问题描述 投票:2回答:3

我只想分享有关Java TimeZone的经验。这是问题所在:时区的inDaylightTime(Date date)函数始终返回0,与日期无关。一致地,getDSTSavings()也返回0。这是创建时区的代码片段:

Timezone timezone = TimeZone.getTimeZone("GMT+1:00");
java calendar timezone dst
3个回答
1
投票

使用类似"UTC+1:00"(或“ GMT + 1:00”)的ID创建的时区对象中的DST与使用相应的字符串"Europe/Berlin"创建的时区对象会有所不同,因此,如果DST对您的应用程序很重要,则始终使用完整的字符串ID代替相应的时间偏移。因此,将时区定义更改为:

Timezone timezone = TimeZone.getTimeZone("Europe/Berlin");

将解决问题。


1
投票

否,TimeZone API计算出日光节约量。您正在使用自定义时区ID。

摘自TimeZone API文档

无法使用自定义时区ID指定夏令时过渡时间表

因此,您需要指定可用于获得夏时制的时区ID

通常,您会使用getDefault获得一个TimeZone,它会根据程序运行的时区创建一个TimeZone。例如,对于在日本运行的程序,getDefault根据日语标准时间创建一个TimeZone对象。您还可以使用getTimeZone和时区ID来获取TimeZone。例如,美国太平洋时区的时区ID为“ America / Los_Angeles”。因此,您可以通过以下方式获取美国太平洋时间TimeZone对象:

使用时区ID,这将节省该特定时区的日光节约时间

 TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");

0
投票

tl; dr

询问是否夏令时有效。

ZoneId
.of( "Europe/Madrid" )
.getRules()
.isDaylightSavings​( Instant.now() )

询问当前生效的UTC前后的偏移量(小时-分钟-秒)。>

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

DST来去去

要询问“夏时制是否有效?”,您必须指定一个时刻。 Daylight Saving Time (DST)的确切定义是,每年两次。

使用Instant指定时刻。

Instant instant = Instant.now() ;  // Capture the current moment as seen in UTC.

java.time

您正在使用可怕的日期时间类,这些类现在已被遗留,几年前被JSR 310中定义的现代java.time类所取代。

Table of all date-time types in Java, both modern and legacy

使用ZoneId而不是TimeZone

偏移与时区

TimeZone.getTimeZone(“ GMT + 1:00”);

字符串GMT+1:00执行not

表示时区,它表示偏移量。现在有很多时区可能恰巧都在使用UTC之前一小时的时间,例如Africa/CasablancaAfrica/BrazzavilleAfrica/TunisEurope/AndorraEurope/Warsaw等。

了解偏移量仅在本初子午线之前或之后数小时-数分钟-秒。偏移量看起来像+05:30-05:00

时区远不止这些。时区是特定地区人民过去,现在和将来对偏移量的更改的历史记录。时区的规则由政客反复设定,并且以惊人的频率变化。

适当的时区名称由Continent/Region组成,例如America/MontrealAmerica/New_York。参见this list of zones at Wikipedia(可能不是最新的)。

ZoneId z = ZoneId.of( "Europe/Gibraltar" ) ;

询问“ DST是否有效吗?”

似乎您想知道DST在特定时区当前是否有效。获取特定ZoneRulesZoneRules。然后ZoneId持续特定时间。

ZoneId

您可以要求interrogate的金额。 ZoneId z = ZoneId.of( "Europe/Gibraltar" ) ; ZoneRules rules = z.getRules() ; boolean dstInEffect = rules.isDaylightSavings​( Instant.now() ) ; 对象表示本初子午线之前或之后的小时-分钟-秒数。

offset-from-UTC currently in effect

关于java.time

ZoneOffset框架内置于Java 8及更高版本中。这些类取代了麻烦的旧ZoneOffset offset = rules.getOffset​( Instant.now() ) ; 日期时间类,例如java.timelegacyjava.util.Date

要了解更多信息,请参见java.util.Date。并在Stack Overflow中搜索许多示例和说明。规格为Calendar

Calendar项目现在位于SimpleDateFormat中,建议迁移到SimpleDateFormat类。

您可以直接与数据库交换java.time

对象。使用兼容Oracle Tutorial或更高版本的JSR 310。不需要字符串,不需要Joda-Time类。

从哪里获取java.time类?

© www.soinside.com 2019 - 2024. All rights reserved.