【发布时间】:2018-08-19 14:06:31
【问题描述】:
这是关于 Java 日历以及我们在多伦多今天夏令时后遇到的影响。
下面是代码
Date date = new Date(); //Sun Mar 11 00:00:00 EST 2018
Integer time = 349;
Calendar scheduleDateCal = Calendar.getInstance();
scheduleDateCal.setTime(date);
scheduleDateCal.set(Calendar.MINUTE, 0);
scheduleDateCal.set(Calendar.HOUR_OF_DAY, 0);
String strSchAdminTime = String.valueOf(time);
Integer schAdminMinute = time;
if (strSchAdminTime.length() >= 2) {
schAdminMinute = Integer.valueOf(strSchAdminTime.substring(strSchAdminTime.length()-2));
}
if(time>60){
Integer schAdminHour = Integer.valueOf(strSchAdminTime.substring(0,strSchAdminTime.length()-2));
scheduleDateCal.add(Calendar.HOUR_OF_DAY, schAdminHour);
}else{
scheduleDateCal.add(Calendar.HOUR_OF_DAY, 0);
}
scheduleDateCal.add(Calendar.MINUTE, schAdminMinute);
System.out.println(scheduleDateCal.getTime());
我知道这段代码没有采用最佳实践,但是我需要在当前版本中维护它。在这里它使用整数来表示时间部分,然后有一个逻辑可以从中提取小时和分钟。
当我遵循逻辑时,小时部分是 3。然后有一个逻辑将此时间添加到日历对象,其值为 'Sun Mar 11 00:00:00 EST 2018' 并带有以下语句
scheduleDateCal.add(Calendar.HOUR_OF_DAY, schAdminHour);
理论上,经过此计算,日历对象的值应为“Sun Mar 11 03:00:00 EDT 2018”。但是它返回“Sun Mar 11 04:00:00 EDT 2018”我知道从今天开始,夏令时时间将提前一小时。任何人都可以帮助我理解这一点
感谢您的帮助。
【问题讨论】:
-
您对最佳实践的看法是正确的。对于最早方便的未来版本,我建议您更改为使用java.time, the modern Java date and time API。
Calendar和Date早已过时,而现代 API 更易于使用。 -
仅供参考,麻烦的旧日期时间类,如
java.util.Date、java.util.Calendar和java.text.SimpleDateFormat现在是 legacy,被 Java 8 和 Java 中内置的 java.time 类所取代9. 见Tutorial by Oracle。
标签: java dst java.util.date java.util.calendar