Java “发生了什么事?”;2017-9-21 23:59;?
我用了一个炉,每次加一分钟。但在日期“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
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 );