Если вы не можете изменить тип возврата infoFacade.getDateFrom()
, мое предложение будет:
ZoneId zone = ZoneId.systemDefault();
LocalDate now1 = LocalDate.now(zone);
int year = now1.getYear();
int previousYear = year - 1;
List<Date> dateList = infoFacade.getDateFrom(documentId);
for (Date from : dateList) {
int yearfrom = from.toInstant().atZone(zone).getYear();
if (yearfrom == year || yearfrom == previousYear) {
idoc.setBauinfoArzvon(from);
}
}
Обе версии вашего кода неявно зависят от часового пояса JVM (который хрупок). Я сделал эту зависимость явной. Я читаю часовой пояс по умолчанию и текущую дату только один раз, чтобы обеспечить согласованные результаты. И путем преобразования Date
сначала в Instant
, а затем в ZonedDateTime
я избегаю и устаревшего метода и старого и устаревшего Calendar
класса. И любые соображения относительно того, добавлять или вычитать 1900 или нет, что дает более ясный код и меньше сомнений со стороны читателя.
Чтобы ответить на ваш вопрос более прямо: нет, в вашей переписанной версии кода вы не должны ни добавлять, ни вычитать 1900 (или любое другое число). Код дает тот же результат. Это связано с тем, что Date
использует «год, основанный на 1900 году» (где 2018 указан, например, как 118), в то время как устаревший класс Calendar
нумерует годы так же, как люди. Меня беспокоит другое: если либо часовой пояс по умолчанию изменяется во время выполнения кода, либо (маловероятно, но возможно), когда проходит Новый год, LocalDate.now()
не будет давать один и тот же результат каждый раз, поэтому ваши результаты будут противоречивыми. Часовой пояс JVM по умолчанию можно изменить в любой момент из другой части вашей программы или из другой программы, работающей в той же JVM.