我按如下方式使用 Calendar 对象:
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.HOUR_OF_DAY, 24);
calendar.get(Calendar.HOUR_OF_DAY)
我希望这个结果是 24,而不是 0。这可能吗?
最佳答案
首先,时间 24:00 是根据 ISO-8601 的有效时间,表示第二天午夜开始。
java.util.GregorianCalendar
不支持 24 小时。 请随时研究以下示例代码并附上我的评论:
// By default lenient behaviour with overflow of 24:00 to next day
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
GregorianCalendar gcal = new GregorianCalendar(2014, Calendar.AUGUST, 17, 0, 0, 0);
gcal.set(Calendar.HOUR_OF_DAY, 24);
System.out.println("HOUR_OF_DAY: " + gcal.get(Calendar.HOUR_OF_DAY)); // 0
System.out.println(sdf.format(gcal.getTime())); // 2014-08-14 00:00
// now switch to strict mode
gcal.setLenient(false);
gcal.set(Calendar.HOUR_OF_DAY, 24);
gcal.getTime(); // triggers recomputation which will fail with following abort
// abort relates to set()-method => java.lang.IllegalArgumentException: HOUR_OF_DAY
大多数其他库也不支持将时间设置为 24:00。Java-8-time 及其前身 Joda-Time 均不提供支持。然而,Java-8-time 可以parse such times但从未设置。
我的 Time4J 库部分允许设置这个时间,即对于类型 PlainTime它确实具有从 00:00 到 24:00(含)的扩展值范围。但是,我决定对 PlainTimestamp
类型(日历日期和挂钟时间的组合)进行不同的处理,因为我想保留时间戳和单个递增计数器之间的双射唯一映射(否则值为 2014 -08-17 24:00 和 2014-08-18 00:00 代表相同的时间戳计数器,导致排序出现问题)。这个问题的 Time4J 解决方案在这里是自动规范化(溢出类似于 GregorianCalendar
类中的宽松行为)。
关于Java 日历配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25341261/