我使用了一个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
.
.
.
有什么简单的观点我误解了吗?
答案 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类。
使用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-UTC,03:30
与04:30
。所以2017年9月21日在伊朗长达25个小时。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。