2016-11-18 56 views
0

我在使用日历实例从日光节约结束并过渡到标准时间时减去一小时时看到此问题。 这里是代码:使用java日历的DST问题日历

Date startTime = new Date();// Gives me Sun Nov 06 01:26:16 EST 2016 
Calendar temp; 
TimeZone timezone = TimeZone.getDefault(); //Eastern 
temp= Calendar.getInstance(timezone); 
temp.setTime(startTime); 
temp.add(Calendar.HOUR_OF_DAY, -1); 
temp.set(Calendar.MILLISECOND, 0); 
    Date endDate = temp.getTime(); // This is still Sun Nov 06 01:26:16 EST 2016 

结果,我希望在结束日期是Sun 2006年11月1时26分16秒EDT 2016,而不是太阳2006年11月1时26分16秒美国东部时间2016年。我不知道如果这是否与设计一样。如果我减去2小时,然后我看到它工作正常。 对此有何意见?

感谢, SS

回答

1

使用java.time

您应该使用java.time类,而不是麻烦的旧日期,时间类,如Calendar比现在的传统。

请务必阅读ZonedDateTime的班级文档以了解如何处理夏令时(DST)切换的选择。

continent/region的格式指定一个proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母缩写,例如ESTEDTIST,因为它们是而不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of("America/New_York"); 
// of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneId zone) 
ZonedDateTime zdt = ZonedDateTime.of(2016 , 11 , 6 , 1 , 26 , 16 , 0 , z); 
ZonedDateTime zdtOneHourEarlier = zdt.minusHours(1); 
ZonedDateTime zdtOneHourLater = zdt.plusHours(1); 

请注意每个结果的偏移距UTC。

zdt.toString():2016-11-06T01:26:16-04:00 [美国/纽约]

zdtOneHourEarlier.toString():2016-11-06T00:26:16 04:00 [美国/纽约]

zdtOneHourLater.toString():2016-11-06T01:26:16-05:00 [美国/纽约]

参见此代码run live at IdeOne.com


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore