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

Java “发生了什么事?”;2017-9-21 23:59;?,java,date,calendar,Java,Date,Calendar,我用了一个炉,每次加一分钟。但在日期“2017-9-21 23:59”中发生了一些奇怪的事情。日期是一小时前。它的行为就像是保存日期时间,但时间日期保存一定不能发生 以下是我的代码和输出: GregorianCalendar fromCalendar = new GregorianCalendar(2017, 8, 21, 22, 58); for (int i = 0; i < 120; i++) { System.out.println(fromCalenda

我用了一个炉,每次加一分钟。但在日期“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/09/22的00:00发生了DST转换:伊朗

因此,您必须使用。

正确且应被接受。很明显,您看到的是时区的切换,例如

java.time 您使用的是麻烦的旧日期时间类,它们现在是遗留的,被java.time类取代

指定用于获取对象的时区

转储到控制台

System.out.println( "zdt1: " + zdt1 );
System.out.println( "zdt2: " + zdt2 );
请看这个网站

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

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

请注意,在午夜加上一分钟是如何让我们回到同一天的晚上11点,但与之不同的是,
03:30
04:30
。因此,2017年9月21日在伊朗持续了25个小时


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

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

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

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

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

为什么您认为不必更改DST?您的时区是什么?您的代码在UTC-07:00中运行良好,我强烈建议不要使用遗留的
java.util.Calendar
。相反,您应该查看
java.time
包,并选择适合您的用例的类。仅供参考,像
GregorianCalendar
java.text.SimpleDateFormat
这样麻烦的旧日期时间类现在被java 8和java 9中内置的类所取代。请参阅。您不应该让@JimGarrison告诉您日期时间对象使用的时区。相反,您应该告诉它应该使用哪个时区。如果您想避免任何和所有DST转换,一个解决方案是使用UTC,例如
OffsetDateTime.of(2017,8,21,22,58,0,0,ZoneOffet.UTC)。plusMinutes(1).plusMinutes(1)
。可以通过从Calendar.setTimeZone(TimeZone.getTimeZone(“亚洲/德黑兰”))添加
来验证良好的搜索:)紧跟在日历上的GregorianCalendar=…
挑剔之后,地区和时区是两件不同的事情。OP必须使用伊朗的时区。
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 );