Java 日历配置

标签 java calendar

我按如下方式使用 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/

相关文章:

java - 尝试通过 java 驱动程序连接时,SSLHandshake 在 mongodb 服务器上失败

java - 2015 年 6 月 30 日闰秒期间在 Amazon Linux AMI 上运行的日历操作

android - 如何在gridview(日历)上获取上个月的天数

Javascript日历在再次选择日期时取消选择日期而不是重新选择它

java - 在 WebView 中显示 YouTube 视频,其显示空白页面;单击播放按钮时,屏幕将变为空白

java - 应用程序引擎+端点生成字符串而不是字节数组作为方法参数

java - 使用 getStyleDdocument 的超链接不起作用

java - 如何从 UiBinder 描述 GXT Window?

calendar - 如何设计日历提醒/警报系统

android - 如何以编程方式填充 Android 设备日历应用程序上的提醒部分?