Java日历配置

时间:2014-08-16 14:44:34

标签: java calendar

我正在使用Calendar对象,如下所示:

Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.HOUR_OF_DAY, 24);

calendar.get(Calendar.HOUR_OF_DAY)

我希望这个结果是24,而不是0.这可能吗?

4 个答案:

答案 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,因此您无需添加任何其他内容。