我正在设置一个带有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
我确信它可能很简单,但我不知道为什么它们会有所不同,我无法在文档中找到解释差异的任何内容
有什么问题?
感谢您的帮助
答案 0 :(得分:1)
LocalDateTime ldt = LocalDateTime.of(
reminder.getReminderYear(),
reminder.getReminderMonth() + 1, // Add one to adjust from zero-based counting.
reminder.getReminderDayofMonth(),
reminder.getReminderHour(),
reminder.getReminderMinute()
);
我建议你停止使用这个陈旧过时的Calendar
课程。今天我们在java.time
中有了很多,现代Java日期和时间API也被称为JSR-310。上面的代码为您提供了我认为您尝试的内容。我假设getReminderMonth()
返回0为基础的月份,因此现代API编号从1增加1,就像人类一样。如果可以,我建议您使用OffsetDateTime
或ZonedDateTime
在时间线上明确指出。
如果至少使用Java 6 ,则可以。
我认为在满足以下两个条件时会发生观察到的日期增量:
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点之前)。下次上述条件适用时,您的错误可能再次出现,