从Java日历实例中获取天、月、年



我有一个从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和功能。因此,避免任何新代码的日历类型

最新更新