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开始,就像人类一样。如果可以,我建议您使用ZonedDateTime
或Calendar
来明确时间线上的点。
问题:我可以在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点之前)。下次上述条件适用时,您的错误可能再次出现,
链接
- Question: How to use ThreeTenABP in Android Project
- ThreeTen Backport home page
- Java Specification Request (JSR) 310
- qazxswpoi,首先定义了现代API
以上是关于Java日历中的差异设置日期与获取日期的主要内容,如果未能解决你的问题,请参考以下文章