我目前有以下代码,由于我怀疑在分配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来完成相同的结果?
答案 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);
}
Date
和LocalDate
之间的显着差异是日期包含时间,但这可能并不意味着2015/12/31 12:00
将在您的Date
对象之后仍然存在2015年。LocalDate
只是一个日期,如果您还想要时间,可以使用LocalDateTime