我想将Date与可选的月和日存储在Java中。
我知道java.time.LocalYear
仅存储年份。
我应该创建自己的自定义类来保存带有可选月份和日期的日期,还是有解决此问题的自定义库?
public class Date {
private LocalYear year;
private int month;
private int day;
public Date(LocalYear year) {
this.year = year;
}
public Date(LocalYear year, int month) {
this.year = year;
this.month = month;
}
public Date(LocalYear year, int month, iny day) {
this.year = year;
this.month = month;
this.day = day;
}
}
答案 0 :(得分:2)
在不知道用例的情况下很难指导您。一种选择是将TemporalAccessor
界面用作带日期和不带月份和/或月份的日期的通用类型,然后放置LocalDate
,YearMonth
或{{1} }放入变量中(最后一个类仅称为Year
(不是Year
,尽管它会与命名方案保持一致))。例如:
LocalYear
我们可以用它做什么?一个例子:
List<TemporalAccessor> dates = List.of(
LocalDate.of(2019, Month.OCTOBER, 3), // full date
YearMonth.of(2019, Month.NOVEMBER), // no day of month
Year.of(2020)); // no month or day of month
这将输出:
for (TemporalAccessor ta : dates) { System.out.println(ta); System.out.println("Year: " + ta.get(ChronoField.YEAR)); if (ta.isSupported(ChronoField.MONTH_OF_YEAR)) { System.out.println("Month: " + ta.get(ChronoField.MONTH_OF_YEAR)); } else { System.out.println("Month: undefined"); } if (ta.isSupported(ChronoField.DAY_OF_MONTH)) { System.out.println("Day: " + ta.get(ChronoField.DAY_OF_MONTH)); } else { System.out.println("Day: undefined"); } System.out.println(); }
我无法确定它能否满足您的要求。
使用2019-10-03
Year: 2019
Month: 10
Day: 3
2019-11
Year: 2019
Month: 11
Day: undefined
2020
Year: 2020
Month: undefined
Day: undefined
常量是低级的,因此您可能希望将ChronoField
包装在具有良好getter的良好类中。例如:
TemporalAccessor
您可以根据需要扩展课程。也许您想让构造函数直接接受public class PartialDate {
private TemporalAccessor date;
public PartialDate(Year year) {
date = year;
}
public PartialDate(Year year, int month) {
date = year.atMonth(month);
}
public PartialDate(Year year, int month, int day) {
date = year.atMonth(month).atDay(day);
}
public Year getYear() {
return Year.from(date);
}
public OptionalInt getMonthValue() {
if (date.isSupported(ChronoField.MONTH_OF_YEAR)) {
return OptionalInt.of(date.get(ChronoField.MONTH_OF_YEAR));
} else {
return OptionalInt.empty();
}
}
// A similar getDay method
}
枚举常量和/或Month
对象和/或获取返回包裹在YearMonth
中的类型的getter。
链接: Oracle tutorial: Date Time解释了如何使用java.time。