java:用可选的月份和日期表示日期

时间:2019-09-29 13:29:03

标签: java class date jodatime

我想将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;
  }
}

1 个答案:

答案 0 :(得分:2)

在不知道用例的情况下很难指导您。一种选择是将TemporalAccessor界面用作带日期和不带月份和/或月份的日期的通用类型,然后放置LocalDateYearMonth或{{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。