我刚刚遇到GregorianCalendar类的一个奇怪的行为,我想知道我是不是真的做了坏事.
这仅在初始化日期的月份的actualMaximum大于我要将日历设置为的月份时附加.
这是示例代码:
// today is 2010/05/31
GregorianCalendar cal = new GregorianCalendar();
cal.set(Calendar.YEAR, 2010);
cal.set(Calendar.MONTH, 1); // FEBRUARY
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND));
return cal.getTime(); // => 2010/03/03, wtf
Run Code Online (Sandbox Code Playgroud)
我知道问题是由于日历初始化日期是31天月(可能),这与设置为2月(28天)的月份相混淆.修复很容易(在设置年份和月份之前将day_of_month设置为1),但我想知道这真的是想要的行为.有什么想法吗 ?
Bal*_*usC 14
它获得当前日期/时间的实际最大值.5月有31天,比2月28日多3天,因此将转移到3月3日.
您需要Calendar#clear()在获取/创建后调用:
GregorianCalendar cal = new GregorianCalendar();
cal.clear();
// ...
Run Code Online (Sandbox Code Playgroud)
这导致:
Sun Feb 28 23:59:59 GMT-04:00 2010
Run Code Online (Sandbox Code Playgroud)
(根据我的时区,这是正确的)
作为其中一个答案表示,java.util.Calendar和Date是史诗般的失败.在进行密集的日期/时间操作时考虑JodaTime.
| 归档时间: |
|
| 查看次数: |
6085 次 |
| 最近记录: |