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

时间:2017-12-17 16:09:43

标签: java android calendar android-calendar

我正在设置一个带有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

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

有什么问题?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

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中有了很多,现代Java日期和时间API也被称为JSR-310。上面的代码为您提供了我认为您尝试的内容。我假设getReminderMonth()返回0为基础的月份,因此现代API编号从1增加1,就像人类一样。如果可以,我建议您使用OffsetDateTimeZonedDateTime在时间线上明确指出。

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

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

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

您的代码出了什么问题

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

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

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

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

链接