我有一个Java类,它在一个位置的纬度/经度和返回时,夏令时间开启和关闭的GMT偏移量。 我正在寻找一种简单的方法在Java中,以确定当前的日期是夏令时间,所以我可以应用正确的偏移量。 目前,我只是在执行此计算为美国时区,虽然最终我想这扩展到全球时区也是如此。
Answer 1:
这是在其上提出的问题机器的答案:
TimeZone.getDefault().inDaylightTime( new Date() );
服务器试图弄清楚这一点,为客户将需要在客户端的时区。 见@Powerlord答案的原因所在。
对于任何特定的时区
TimeZone.getTimeZone( "US/Alaska").inDaylightTime( new Date() );
Answer 2:
TL;博士
ZoneId.of( "America/Montreal" ) // Represent a specific time zone, the history of past, present, and future changes to the offset-from-UTC used by the people of a certain region.
.getRules() // Obtain the list of those changes in offset.
.isDaylightSavings( // See if the people of this region are observing Daylight Saving Time at a specific moment.
Instant.now() // Specify the moment. Here we capture the current moment at runtime.
) // Returns a boolean.
java.time
这里是现代java.time (参见教程 )的版本正确答案的mamboking 。
- 一个
ZoneId
代表一个时区。 该类知道,告诉我们,如果规则DST适用于一个特定的时间段 。 - 该
ZoneRules
类车型全部为一个时区的历史和未来的过渡。 - 一个
Instant
是在时间轴上的一个时刻UTC 。 - 甲
ZonedDateTime
是施加的结果ZoneId
到Instant
。
示例代码:
ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
ZoneId z = now.getZone();
ZoneRules zoneRules = z.getRules();
Boolean isDst = zoneRules.isDaylightSavings( now.toInstant() );
注意如何在最后一行,我们不得不提取Instant
从我们的对象ZonedDateTime
对象用一个简单的调用toInstant
。
关于java.time
该java.time框架是建立在Java 8和更高版本。 这些类取代麻烦的老传统日期时间类,如java.util.Date
, Calendar
,和SimpleDateFormat
。
该乔达-时间的项目,现在在维护模式 ,建议迁移到java.time类。
要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。 规范是JSR 310 。
您可以直接与数据库交换java.time对象。 使用JDBC驱动程序与兼容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功能后移植到Java 6和7 ThreeTen,反向移植 。
- Android的
- 后来版本的java.time类的Android束实现的。
- 对于较早的Android(<26),则ThreeTenABP项目适应ThreeTen-反向移植 (上面提到的)。 请参阅如何使用ThreeTenABP ... 。
该ThreeTen-额外项目与其他类扩展java.time。 该项目是为将来可能增加的java.time试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
Answer 3:
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());
Answer 4:
你将不得不使用这些坐标做更多的工作,并找出他们在哪个时区。一旦你知道哪个时区也就是isDayLight()方法将是有益的。
例如,你有没有告诉-0500是否EST(美国/加拿大东部标准时间),CDT(美国/加拿大中部夏令时间),COT(哥伦比亚时间),AST(巴西阿克里标准时间),ECT(厄瓜多尔方式时间),等等。
其中的一些可能会或可能不支持夏令时。
Answer 5:
乔达时间包含处理方法,将计算补偿给你。 见DateTimeZone.convertLocalToUTC(...)
为了补充这一点,你需要查找当前时区与经/纬度信息。 GeoNames的提供了一个Java客户端其网络服务,以及一个简单的web请求框架(即http://ws.geonames.org/timezone?lat=47.01&lng=10.2 )