如何修复不建议使用的.getDate()

时间:2019-09-01 13:00:58

标签: java calendar deprecated jcalendar

我一直在从事一个项目,在我的private static class MyDateEvaluator中,有一个已弃用的api,即getDate()

这是我的第一个代码:

    @Override
    public boolean isInvalid(Date date) {
    return date.getDay() == 0;
    }

然后我尝试将其更改为Calendar.get(Calendar.DAY_OF_MONTH),但是它不起作用,并且出现错误消息,

  

MyDateEvaluator不是抽象的。

    public boolean isInvalid(Calendar Calendar) {
        return 0 == Calendar.get(Calendar.DAY_OF_MONTH);

    }

2 个答案:

答案 0 :(得分:1)

java.time

我建议:

Set<DayOfWeek> invalidDays = EnumSet.of(DayOfWeek.SUNDAY);

@Override
public boolean isInvalid(Date date) {
    // First convert to a modern type
    ZonedDateTime zdt = date.toInstant().atZone(ZoneId.systemDefault());
    DayOfWeek dow = zdt.getDayOfWeek();
    return invalidDays.contains(dow);
}

如果您可以完全避免使用老式的Date类,那就更好了。我假设方法签名位于您不能更改的接口或超类中。如果是这样,则该参数确实必须具有类型Date,我们不能用LocalDate替代(也不能像您尝试的那样用Calendar替代)。

DateCalendar的设计均较差且已过时。因此,当我们得到Date时,我们可以做的最好的事情就是将其转换为Instant并从那里执行任何进一步的转换。我的代码取决于JVM的默认时区,这是不稳定的,因为可以随时更改设置。但是,由于Date类的不良设计,我们无法避免这种情况。

比上述方法更简单并且可能足够好的一个方法是声明DayOfWeek invalidDay = DayOfWeek.SUNDAY;而不是集合,并使用.equals进行比较。

答案 1 :(得分:0)

尝试一下

 @Override
 public boolean isInvalid(Date date) {
      Calendar c = Calendar.getInstance();
      c.setTime(date);
      return 0 == c.get(Calendar.DAY_OF_WEEK);
 }