-->

确定是否夏令时(DST)是活跃在Java中指定日期(Determine Whether Daylig

2019-06-24 11:34发布

我有一个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是施加的结果ZoneIdInstant

示例代码:

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.DateCalendar ,和SimpleDateFormat

乔达-时间的项目,现在在维护模式 ,建议迁移到java.time类。

要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。 规范是JSR 310 。

您可以直接与数据库交换java.time对象。 使用JDBC驱动程序与兼容JDBC 4.2或更高版本。 无需串,没有必要java.sql.*类。

从哪里获取java.time类?

  • 的Java SE 8Java SE的9Java SE的10Java 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试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多 。



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 )



文章来源: Determine Whether Daylight Savings Time (DST) is Active in Java for a Specified Date