“2017-9-21 23:59”发生了什么?

时间:2018-01-09 06:32:53

标签: java date calendar

我使用了一个calander,每次都加一分钟。但在“2017-9-21 23:59”日期发生了一些奇怪的事情。这个日期回来了一个小时。它的行为就像日期节省时间,但不能保存时间日期。

这是我的代码和输出:

GregorianCalendar fromCalendar = new GregorianCalendar(2017, 8, 21, 22, 58);

    for (int i = 0; i < 120; i++) {
        System.out.println(fromCalendar.get(Calendar.YEAR) + "-"
                + (fromCalendar.get(Calendar.MONTH) + 1) + "-" +   fromCalendar.get(Calendar.DAY_OF_MONTH) + " "
                + fromCalendar.get(Calendar.HOUR_OF_DAY) + ":" + fromCalendar.get(Calendar.MINUTE) + "      ");
        fromCalendar.add(Calendar.MINUTE, 1);
    }

输出:

.
.
.
2017-9-21 23:58     
2017-9-21 23:59     
2017-9-21 23:0      
2017-9-21 23:1      
2017-9-21 23:2  
.
.
.

有什么简单的观点我误解了吗?

2 个答案:

答案 0 :(得分:10)

根据the TimeAndDate.com DST page,世界上只有一个国家的DST转换发生在2017/09/22 00:00:伊朗

因此,您必须使用the timezone for Iran: Asia/Tehran

答案 1 :(得分:3)

Answer by Jim Garrison是正确的,应该被接受。您显然看到Daylight Saving Time时区的Asia/Tehran切换。

java.time

你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。

使用ZoneId指定时区以获取ZonedDateTime对象。

ZoneId z = ZoneId.of( "Asia/Tehran" ) ;  // Testing the Daylight Saving Time cut-over in Iran.
ZonedDateTime zdt1 = ZonedDateTime.of( 2017 , 9 , 21 , 23 , 59 , 0 , 0 , z );  // Set the moment to what might *appear* be the minute before midnight but is not, is actually an hour and a minute before midnight. 
ZonedDateTime zdt2 = zdt1.plusMinutes( 1 );  // Adding a minute takes us to 11 PM again, but with a different offset-from-UTC, for a 25-hours long day. 

转储到控制台。

System.out.println( "zdt1: " + zdt1 );
System.out.println( "zdt2: " + zdt2 );

请参阅此code run live at IdeOne。com。

  

zdt1:2017-09-21T23:59 + 04:30 [亚洲/德黑兰]

     

zdt2:2017-09-21T23:00 + 03:30 [亚洲/德黑兰]

请注意,如果在午夜时间内添加一分钟,请将我们发送回同一天的晚上11点,但使用不同的offset-from-UTC03:3004:30。所以2017年9月21日在伊朗长达25个小时。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore