我只想分享有关Java TimeZone的经验。这是问题所在:时区的inDaylightTime(Date date)
函数始终返回0,与日期无关。一致地,getDSTSavings()
也返回0。这是创建时区的代码片段:
Timezone timezone = TimeZone.getTimeZone("GMT+1:00");
使用类似"UTC+1:00"
(或“ GMT + 1:00”)的ID创建的时区对象中的DST与使用相应的字符串"Europe/Berlin"
创建的时区对象会有所不同,因此,如果DST对您的应用程序很重要,则始终使用完整的字符串ID代替相应的时间偏移。因此,将时区定义更改为:
Timezone timezone = TimeZone.getTimeZone("Europe/Berlin");
将解决问题。
否,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");
询问是否夏令时有效。
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类所取代。
使用ZoneId
而不是TimeZone
。
TimeZone.getTimeZone(“ GMT + 1:00”);
字符串GMT+1:00
执行not
Africa/Casablanca
,Africa/Brazzaville
,Africa/Tunis
,Europe/Andorra
,Europe/Warsaw
等。了解偏移量仅在本初子午线之前或之后数小时-数分钟-秒。偏移量看起来像+05:30
或-05:00
。
时区远不止这些。时区是特定地区人民过去,现在和将来对偏移量的更改的历史记录。时区的规则由政客反复设定,并且以惊人的频率变化。
适当的时区名称由Continent/Region
组成,例如America/Montreal
或America/New_York
。参见this list of zones at Wikipedia(可能不是最新的)。
ZoneId z = ZoneId.of( "Europe/Gibraltar" ) ;
询问“ DST是否有效吗?”
似乎您想知道DST在特定时区当前是否有效。获取特定
ZoneRules
的ZoneRules
。然后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.time,legacy和java.util.Date
。
要了解更多信息,请参见java.util.Date
。并在Stack Overflow中搜索许多示例和说明。规格为Calendar
。
Calendar
项目现在位于SimpleDateFormat
中,建议迁移到SimpleDateFormat
类。
您可以直接与数据库交换java.time
对象。使用兼容Oracle Tutorial或更高版本的JSR 310。不需要字符串,不需要Joda-Time类。从哪里获取java.time类?
java.sql.*
和Java SE 8