2017-06-30 62 views
0

任何人都可以告诉我为什么下面的代码返回10.5小时,而IST和EST之间的实际区别是9.5小时。来自不同时区的时间差

使用getRawOffset():

System.out.println(TimeZone.getDefault().getRawOffset() - TimeZone.getTimeZone("EST").getRawOffset()); 

使用的getOffset():

TimeZone current = TimeZone.getDefault(); 
TimeZone db = TimeZone.getTimeZone("EST"); 
long now = System.currentTimeMillis(); 
System.out.println(db.getOffset(now) - current.getOffset(now)); 

我的JVM是IST时区

+1

不要使用 “EST”。使用“America/New_York”,如果那是你的意思区域(否则其他一些Olson ID)。 –

+0

太棒了!有效 。谢谢 。您可以将其添加为答案。 – Rehman

回答

2

因为... reasons“ EST“没有观察到日光节约变化(类似地,HST和MST不能,而P ST(和其他)做)。

改为使用"America/New_York"

注意在Javadoc

三字母时区ID

声明对于JDK 1.1.x的兼容,一些三字母时区ID(比如“PST”,“ CTT“,”AST“)也被支持。但是,由于多个时区经常使用相同的缩写(例如,“CST”可能是美国“中央标准时间”和“中国标准时间”),因此它们的使用已被废弃,并且Java平台只能识别其中的一个他们。

“IST”可以指“爱尔兰标准时间”,“以色列标准时间”和“印度标准时间”。切勿使用3个字母的缩写来表示时区。

1

IST为UTC + 5:30和EST为UTC-5:00

所以我们之间有10:30。也许你想EDT而不是EST

参见:https://www.timeanddate.com/worldclock/converter.html?iso=20170630T090000&p1=tz_ist&p2=tz_est&p3=tz_et

顺便说一句,在Java 8中的代码如下:

final LocalDateTime ist = LocalDateTime.now(ZoneId.of("IST", ZoneId.SHORT_IDS)); 
    final LocalDateTime est = LocalDateTime.now(ZoneId.of("EST", ZoneId.SHORT_IDS)); 
    System.out.println(Duration.between(ist, est)); // Prints PT-10H-30M0.001S 
+1

我一直在犹豫是否使用现代Java 8类(已被回迁到Java 6和7),但我仍然同意其他答案:**避免三个**(和四个)**字母时区缩写**。 –

+1

是的,我同意他也;) – Prim

+1

你*当然*不想'EDT',因为这不是'TimeZone'类识别的时区,所以你最终会不小心使用'GMT'。 –