Java:计算时区差

Java:计算时区差,java,timezone,dst,Java,Timezone,Dst,在Java中,如何从GMT获取特定日期和时区的时差 确定特定时区是否在DST中非常简单: boolean isIsraelInDST = TimeZone.getTimeZone("Israel").inDaylightTime(new Date()); 如何获取实际时差?使用时区。getRawOffset():返回要添加到UTC以获取此时区标准时间的时间量(以毫秒为单位)。由于该值不受夏令时的影响,因此称为原始偏移 如果希望偏移量包括DST,那么可以使用TimeZone.getOffset(

在Java中,如何从GMT获取特定日期和时区的时差

确定特定时区是否在DST中非常简单:

boolean isIsraelInDST = TimeZone.getTimeZone("Israel").inDaylightTime(new Date());
如何获取实际时差?

使用时区。getRawOffset():返回要添加到UTC以获取此时区标准时间的时间量(以毫秒为单位)。由于该值不受夏令时的影响,因此称为原始偏移


如果希望偏移量包括DST,那么可以使用TimeZone.getOffset(长日期)。您应该为该方法提供具体的日期,例如now-System.currentTimeMillis()

我看到这是一个旧线程-但是添加这个,因为我最近有一个类似的要求- 这给出了基于当前时间(从历元算起的毫秒)的实际差值(以毫秒为单位)


我建议在getRawOffset中添加夏季/冬季时间偏移:

    TimeZone tz1 = TimeZone.getTimeZone("GMT");
    TimeZone tz2 = TimeZone.getTimeZone("America/New_York");
    long timeDifference = tz1.getRawOffset() - tz2.getRawOffset() + tz1.getDSTSavings() - tz2.getDSTSavings();
公共字符串时区(日期){
时区TimeZone=TimeZone.getTimeZone(“美国/纽约”);
long millis=timeZone.getRawOffset()+(timeZone.inDaylightTime(date)?timeZone.getdstssavings():0);
返回字符串。格式(“%s%s:%s”,
毫秒<0?“-”:“+”,
String.format(“%02d”,Math.abs(TimeUnit.millides.toHours(millis)),
String.format(“%02d”,Math.abs(TimeUnit.millizes.toMinutes(millis)-TimeUnit.HOURS.toMinutes(TimeUnit.millizes.toHours(millis)))
);
}
tl;博士 +13:00

在某个日期的第一刻

ZoneId.of( "Pacific/Auckland" )
    .getRules()
    .getOffset( 
        LocalDate.of( 2018 , Month.AUGUST , 23 )          // Specify a certain date. Has no concept of time zone or offset.
        .atStartOfDay( ZoneId.of( "Pacific/Auckland" ) )  // Determine the first moment of the day on that date in that region. Not always `00:00:00` because of anomalies such as Daylight Saving Time.
        .toInstant()                                      // Adjust to UTC by extracting an `Instant`. 
    ) 
    .toString()
+12:00

避免遗留日期时间类 其他答案已经过时,因为
TimeZone
类现在已经过时。这个和其他麻烦的旧日期时间类被java.time类取代

java.time 现在我们使用,
ZoneOffset
ZoneRules
代替传统的
TimeZone

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

获取该区域的规则

ZoneRules rules = z.getRules() ;
询问规则夏令时(DST)是否在特定时刻生效。将力矩指定为
瞬间
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

如何获得实际时差

我不知道你的意思,但我猜你是在要求在那一刻比区有效。偏移量是距离的小时数、分钟数和秒数。我们使用类来表示偏移量。时区是特定地区人民使用的过去、现在和未来偏移量变化的历史。我们使用类来表示时区

由于某个区域的偏移量可能随时间而变化,因此我们在请求偏移量时必须经过一段时间

ZoneOffset offset = rules.getOffset( instant ) ;
以标准格式生成表示该偏移量的字符串

String output output = offset.toString() ;
您可以要求将偏移量作为总秒数

int offsetInSeconds = offset.getTotalSeconds() ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

使用兼容的或更高版本,您可以直接与数据库交换java.time对象。不需要字符串,也不需要java.sql.*类

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可能会在这里找到一些有用的类,例如、、和。

我想要偏移量,包括DST。很抱歉发布到这样一个旧线程,但我有一个困惑。如果我使用TimeZone.getOffset(longdate),它是否假定日期参数是本地时间还是UTC?特别是,如果您在纽约日间节光时间切换前几个小时,但在UTC后几个小时调用它,它是否会包括切换?长日期是从1970-01-01 UTC起的毫秒。更新:
时区
类在几年前被JSR 310取代。相反,使用
ZoneId
ZoneRules
.FYI,像
TimeZone
,,,
java.text.simpleDataFormat
这样麻烦的旧日期时间类现在被java 8和java 9中内置的类所取代。请参阅。在使用tz2.inDaylightTime(new Date())进行调整之前,您不需要检查DST是否有效吗;
ZoneRules rules = z.getRules() ;
Instant instant = Instant.now() ;  // Capture current moment in UTC.
boolean isDst = rules.isDaylightSavings( instant ) ;
ZoneOffset offset = rules.getOffset( instant ) ;
String output output = offset.toString() ;
int offsetInSeconds = offset.getTotalSeconds() ;