我有一个从JavaCalendar
派生的Instant
,例如c.toInstant()
,现在在另一个位置将其转换为自定义Date对象,该对象需要月、月和年中的某一天。我试过了:
if (instance.isSupported(ChronoField.DAY_OF_MONTH) && instance.isSupported(ChronoField.MONTH_OF_YEAR) && instance.isSupported(ChronoField.YEAR)) {
return new com.company.common.Date()
.setDay(instance.get(ChronoField.DAY_OF_MONTH))
.setMonth(instance.get(ChronoField.MONTH_OF_YEAR))
.setYear(instance.get(ChronoField.YEAR));
}
但是当我试图编译ErrorProne时抛出:
...impl/utils/DateUtils.java:21: error: [TemporalAccessorGetChronoField] TemporalAccessor.get() only works for certain values of ChronoField.
.setDay(instance.get(ChronoField.DAY_OF_MONTH))
^
我不知道为什么我在任何地方都找不到答案,但经过一番搜索,我没有找到任何帮助——尽管我可能遗漏了什么。
Instant
只是一个时间戳,它只提供秒、毫秒和纳米。
如果您首先从Calendar
实例开始,那么您应该能够简单地使用
calendar.get(Calendar.YEAR)
calendar.get(Calendar.MONTH) + 1
calendar.get(Calendar.DAY_OF_MONTH)
直接获取日期值并跳过到Instant的转换。
请注意,在Calendar
中,月份是一个基于零的值。你通常必须加一个才能达到人们通常期望的值。
如果您更喜欢使用较新的时间API,您可以从类似的ZonedDateTime
获取日期和时间
Calendar calendar = Calendar.getInstance();
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(calendar.toInstant(), calendar.getTimeZone().toZoneId());
zonedDateTime.getYear();
zonedDateTime.getMonthValue();
zonedDateTime.getDayOfMonth();
除了得到";正确的";直接在此处显示月份的值。如果您想对日期值做任何额外的工作,而不仅仅是阅读其内容,那么它可能会很有用。
一般来说,与旧的Calendar
类型相比,java.time包中的ZonedDateTime
和所有其他类型提供了更健壮的API和功能。因此,避免任何新代码的日历类型