Java夏令时不适用于遥远的过去(更新:确实如此)?

时间:2011-08-29 16:12:15

标签: java date dst

以下代码:

TimeZone.getTimeZone("Europe/Athens").inDaylightTime(new Date(200, 8, 14));

返回true,就像2011年一样。但是,Daylight Saving Time(DST)仅在大约100年前提出,并且最近才应用。 200年的时间是否被认为是DST,还是Java怪癖?

4 个答案:

答案 0 :(得分:6)

你错了。当您使用日期new Date(-1700, 8, 14)(年200)时,它会按预期工作。您正在使用的构造函数是将1900添加到您的年份。您实际上正在使用年2100

检查Date constructor api。

答案 1 :(得分:3)

这取决于时区数据库。一些语言环境带有非常详细的时间指令(例如记录19世纪的UTC偏移的8分钟变化),而其他语言环境则满足于在合理接近它们创建日期时有用 - 可能是因为编译器的数据库无法轻易获取有关何时制定当前方案以及之前的方案的信息,因此将其编码为“适用于此类之前的所有时间”。

答案 2 :(得分:1)

您正在测试的日期是

  

2100年9月14日12:00 AM

不是过去,而是将来!要打印确切日期,请尝试

DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.SHORT).format(new Date(200, 8, 14))

答案 3 :(得分:0)

为了好玩,我在使用Java 7的Joda-Time 2.3中尝试了这一点。看起来它可以正常工作。

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

DateTime dateTime = new DateTime( 200, 8, 14, 0, 0, 0, DateTimeZone.forID( "Europe/Athens" ) );
boolean isDST = !( DateTimeZone.forID( "Europe/Athens" ).isStandardOffset( dateTime.getMillis() ) );

转储到控制台...

System.out.println( "dateTime: " + dateTime );
System.out.println( "isDST: " + isDST );

跑步时......

dateTime: 0200-08-14T00:00:00.000+01:34:52
isDST: false