静态块设置日历用于分配 - 日期

时间:2016-03-30 08:31:11

标签: java date calendar final

我目前有以下代码,由于我怀疑在分配static block之前没有调用programCutoffDate2015,因此无法正常使用。

private final static Calendar programCutoffDate2015Cal = Calendar.getInstance();
    static{
        programCutoffDate2015Cal.set(2015, 12,31);
    }
    private final static Date programCutoffDate2015 = programCutoffDate2015Cal.getTime();

以前我使用的是已弃用的API:

private final static Date programCutoffDate2015 = new Date(2015, 12,31);

如何使用JDK中未弃用的较新API来完成相同的结果?

1 个答案:

答案 0 :(得分:6)

Date没有时区概念,并且是可变的。在过去几十年左右的时间里,API的差异很大。我建议使用添加到Java 8的JSR 310 API,但可以使用旧版本的backports

LocalDate date = LocalDate.of(2015,12,31);

注意:虽然这是基于JodaTime的优秀工作,但它是一个不同的API。

  

有没有办法在programCutoffDate2015声明或其他方式之前执行静态块?

静态块按顺序执行,从上到下显示在代码中。即使多个线程同时尝试加载类,也无法更改此设置。

假设您有另一个API存在上述问题,我建议使用辅助方法将其包装。

private static Date newDate(int year, int month, int day) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, day);
    // if you want the last milli-second of the day for an upper bound
    cal.add(Calendar.DAY_OF_MONTH, 1);
    cal.add(Calendar.MILLISECOND, -1);
    return cal.getTime();
}

private final static Date programCutoffDate2015 = newDate(2015, 12, 31);

甚至更好

private static LcoalDate lastDayOf(int year) {
    return LocalDate.of(year+1, 1, 1).minusDays(1);
}

DateLocalDate之间的显着差异是日期包含时间,但这可能并不意味着2015/12/31 12:00将在您的Date对象之后仍然存在2015年。LocalDate只是一个日期,如果您还想要时间,可以使用LocalDateTime