Java日历中的差异设置日期与获取日期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java日历中的差异设置日期与获取日期相关的知识,希望对你有一定的参考价值。

我正在设置一个带有int值的日历日期,但是当我从创建的日历再次检查该值时,它比我设置的值多1。而且我不确定为什么?

这是一个例子:

System.out.println("DEBUG: Reminder day of month = " + reminder.getReminderDayofMonth());

calendar.set(Calendar.YEAR, reminder.getReminderYear());                   
calendar.set(Calendar.MONTH, reminder.getReminderMonth());
calendar.set(Calendar.DAY_OF_MONTH, reminder.getReminderDayofMonth());
calendar.set(Calendar.HOUR, reminder.getReminderHour());
calendar.set(Calendar.MINUTE, reminder.getReminderMinute());

System.out.println("DEBUG: Calendar day of month = " + calendar.get(Calendar.DAY_OF_MONTH));

我做了println,所以你可以看到值和值。我希望调用calander.get(Calander.DAY_OF_MONTH)会返回与我放入的值相同的值。但它没有,我得到:

DEBUG: Reminder day of month = 18
DEBUG: Calendar day of month = 19

我确信它可能很简单,但我不知道为什么它们会有所不同,我在文档中找不到任何解释差异的内容

问题是什么?

谢谢你的帮助

答案

TL:DR

LocalDateTime ldt = LocalDateTime.of(
    reminder.getReminderYear(),
    reminder.getReminderMonth() + 1,  // Add one to adjust from zero-based counting.
    reminder.getReminderDayofMonth(),
    reminder.getReminderHour(),
    reminder.getReminderMinute()
);

java.time

我建议你结束使用非常陈旧的长期Calendar课程。今天我们在java.time上做得更好,getReminderMonth()是现代Java日期和时间API,也称为JSR-310。上面的代码为您提供了我认为您尝试的内容。我假设OffsetDateTime返回0个月,所以加上1,因为现代API数字从1开始,就像人类一样。如果可以,我建议您使用ZonedDateTimeCalendar来明确时间线上的点。

问题:我可以在Java版本中使用现代API吗?

如果至少使用Java 6,则可以。

  • 在Java 8及更高版本中,新的API内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR-310的ThreeTen;下面的链接)。
  • android上,使用Android版的ThreeTen Backport。它被称为ThreeTenABP。请参阅下面的链接问题。

您的代码出了什么问题

我认为当满足以下两个条件时,会发生观察到的日期增量:

  • 您的代码在下午运行,即在getReminderHour()的时区中午12点或更晚(通常是JVM的时区,通常是您当地的时区)。
  • Calendar在下午返回一小时,即12或更晚。

我不能100%肯定,因为你没有向我们展示产生你的bug的代码。但很可能你的Calendar.getInstance()实例是用当前时间创建的(例如,new GregorianCalendar()calendar.set(Calendar.HOUR, reminder.getReminderHour()),这样做)。在下午,它显然是在下午的时间创建的。然后当你调用if时,这会尝试在PM内设置小时,但由于小时数为12或更大,因此会溢出到第二天的AM。例如,一小时14(PM)在第二天凌晨2点。

如果我是正确的,问题似乎可以解决,不是因为您在Oracle tutorial trail: Date Time语句中移动了日历对象的创建,而是因为您在早上运行程序或提醒时间是在早上(中午12点之前)。下次上述条件适用时,您的错误可能再次出现,

链接

以上是关于Java日历中的差异设置日期与获取日期的主要内容,如果未能解决你的问题,请参考以下文章

使用日历视图减去日期[重复]

调试与日历日期 GMT 相关的简单 java 代码

获取java中的日期之间的差异[重复]

如何从日历中获取日期[复制]

Java 日期与日历

日历-两个日期之间的差异