我有一个Java类,它接收位置的纬度/经度,并在夏令时开启和关闭时返回GMT偏移 . 我正在寻找一种简单的方法来确定Java当前日期是否为夏令时,因此我可以应用正确的偏移量 . 目前我只对美国时区执行此计算,但最终我还希望将其扩展到全球时区 .
这是问题所在机器的答案:
TimeZone.getDefault().inDaylightTime( new Date() );
试图为客户端解决这个问题的服务器需要客户端的时区 . 请参阅@Powerlord的答案 .
对于任何特定的TimeZone
TimeZone.getTimeZone( "US/Alaska").inDaylightTime( new Date() );
ZoneId.of( "America/Montreal" ) .getRules() .isDaylightSavings( Instant.now() )
这是java.time的java.time(见Tutorial)版本mamboking .
A ZoneId代表一个时区 . 该类知道判断DST是否适用于a particular time zone的规则 .
ZoneRules类为时区的所有历史和未来过渡建模 .
Instant是UTC中时间轴上的一个时刻 .
A ZonedDateTime是将 ZoneId 应用于 Instant 的结果 .
ZoneId
Instant
示例代码:
ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ); … ZoneId z = now.getZone(); ZoneRules zoneRules = z.getRules(); Boolean isDst = zoneRules.isDaylightSavings( now.toInstant() );
注意在最后一行中我们如何通过简单调用toInstant从 ZonedDateTime 对象中提取 Instant 对象 .
ZonedDateTime
java.time框架内置于Java 8及更高版本中 . 这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date,Calendar和SimpleDateFormat .
现在位于maintenance mode的Joda-Time项目建议迁移到java.time类 .
要了解更多信息,请参阅Oracle Tutorial . 并搜索Stack Overflow以获取许多示例和解释 . 规格是JSR 310 .
您可以直接与数据库交换java.time对象 . 使用JDBC driver符合JDBC 4.2或更高版本 . 不需要字符串,不需要 java.sql.* 类 .
java.sql.*
从哪里获取java.time类?
Java SE 8,Java SE 9,Java SE 10,Java SE 11和更高版本 - 带有捆绑实现的标准Java API的一部分 .
Java 9增加了一些小功能和修复 .
Java SE 6和Java SE 7
大多数java.time功能都在ThreeTen-Backport中反向移植到Java 6和7 .
Android
更新版本的Android捆绑java.time类的实现 .
对于早期的Android(<26),ThreeTenABP项目适应ThreeTen-Backport(如上所述) . 见How to use ThreeTenABP… .
ThreeTen-Extra项目使用其他类扩展java.time . 该项目是未来可能添加到java.time的试验场 . 您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter和more .
TimeZone tz = TimeZone.getTimeZone("EST"); boolean inDs = tz.inDaylightTime(new Date());
你将不得不使用这些坐标做更多的工作,并找出它们所在的时区 . 一旦你知道了哪个TimeZone,isDayLight()方法将是有用的 .
例如,您无法分辨-0500是EST(美国/加拿大东部标准时间),CDT(美国/加拿大中部夏令时),COT(哥伦比亚时间),AST(巴西英亩标准时间),ECT(厄瓜多尔)时间)等......
其中一些可能支持也可能不支持夏令时 .
Joda Time包含将为您计算偏移量的处理方法 . 见DateTimeZone.convertLocalToUTC(...)
要补充这一点,您需要使用纬度/经度信息查找当前时区 . GeoNames为其Web服务提供了一个Java客户端,以及一个简单的Web请求框架(即http://ws.geonames.org/timezone?lat=47.01&lng=10.2)
5 回答
这是问题所在机器的答案:
试图为客户端解决这个问题的服务器需要客户端的时区 . 请参阅@Powerlord的答案 .
对于任何特定的TimeZone
tl;博士
java.time
这是java.time的java.time(见Tutorial)版本mamboking .
A ZoneId代表一个时区 . 该类知道判断DST是否适用于a particular time zone的规则 .
ZoneRules类为时区的所有历史和未来过渡建模 .
Instant是UTC中时间轴上的一个时刻 .
A ZonedDateTime是将
ZoneId
应用于Instant
的结果 .示例代码:
注意在最后一行中我们如何通过简单调用toInstant从
ZonedDateTime
对象中提取Instant
对象 .关于java.time
java.time框架内置于Java 8及更高版本中 . 这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date,Calendar和SimpleDateFormat .
现在位于maintenance mode的Joda-Time项目建议迁移到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 SE 10,Java SE 11和更高版本 - 带有捆绑实现的标准Java API的一部分 .
Java 9增加了一些小功能和修复 .
Java SE 6和Java SE 7
大多数java.time功能都在ThreeTen-Backport中反向移植到Java 6和7 .
Android
更新版本的Android捆绑java.time类的实现 .
对于早期的Android(<26),ThreeTenABP项目适应ThreeTen-Backport(如上所述) . 见How to use ThreeTenABP… .
ThreeTen-Extra项目使用其他类扩展java.time . 该项目是未来可能添加到java.time的试验场 . 您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter和more .
你将不得不使用这些坐标做更多的工作,并找出它们所在的时区 . 一旦你知道了哪个TimeZone,isDayLight()方法将是有用的 .
例如,您无法分辨-0500是EST(美国/加拿大东部标准时间),CDT(美国/加拿大中部夏令时),COT(哥伦比亚时间),AST(巴西英亩标准时间),ECT(厄瓜多尔)时间)等......
其中一些可能支持也可能不支持夏令时 .
Joda Time包含将为您计算偏移量的处理方法 . 见DateTimeZone.convertLocalToUTC(...)
要补充这一点,您需要使用纬度/经度信息查找当前时区 . GeoNames为其Web服务提供了一个Java客户端,以及一个简单的Web请求框架(即http://ws.geonames.org/timezone?lat=47.01&lng=10.2)