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

Men*_*los -3 java calendar final date

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

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

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

private final static Date programCutoffDate2015 = new Date(2015, 12,31);
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*rey 6

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

LocalDate date = LocalDate.of(2015,12,31);
Run Code Online (Sandbox Code Playgroud)

注意:虽然这是基于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);
Run Code Online (Sandbox Code Playgroud)

甚至更好

private static LcoalDate lastDayOf(int year) {
    return LocalDate.of(year+1, 1, 1).minusDays(1);
}
Run Code Online (Sandbox Code Playgroud)

Date和之间的显着差异LocalDate是日期有一个时间包括虽然这可能不是2015/12/31 12:00你的Date对象仍然在2015年之后. LocalDate只是一个日期,如果你想要一个时间,你可以使用LocalDateTime