我正在使用Calendar对象,如下所示:
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.HOUR_OF_DAY, 24);
calendar.get(Calendar.HOUR_OF_DAY)
我希望这个结果是24,而不是0.这可能吗?
答案 0 :(得分:3)
不使用GregorianCalendar
。时间从零开始,没有24号小时。
答案 1 :(得分:2)
如果将字段Calendar.HOUR_OF_DAY设置为24,则将其设置为第二天的0。 一天24小时不存在。
答案 2 :(得分:2)
首先,时间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时间可以parse such times但不能设置。
我的库Time4J部分允许设置此时间,即类型PlainTime,其确实具有从00:00到24:00(包括)的扩展值范围。但是,我决定以PlainTimestamp
类型(日历日期和挂起时间的组合)对它进行不同的处理,因为我想保留时间戳和单个递增计数器之间的双射唯一映射(否则值为2014-08- 17 24:00和2014-08-18 00:00将代表同一时间戳计数器导致排序问题)。针对此问题的Time4J解决方案是自动规范化(溢出类似于类GregorianCalendar
中的宽松行为)。
答案 3 :(得分:0)
我认为命令
Calendar.get(Calendar.HOUR_OF_DAY); 从上午/下午转换为24H,因此您无需添加任何其他内容。