Date.getYear () и Calendar.get (Calendar.YEAR) - изменение реализации. Это будет работать? - PullRequest
0 голосов
/ 08 ноября 2018

Я задаю этот вопрос, потому что на самом деле у меня нет абсолютно никакого способа проверить это дело, и, возможно, кто-то может мне это объяснить:)

Я работал над фрагментом кода, который был написанчеловек, который очень плохо знаком с программированием.Этот код выглядит следующим образом:

List<Date> dateList = infoFacade.getDateFrom(documentId);
for(Date from : dateList) {

    LocalDate now1 = LocalDate.now();
    int year = now1.getYear();
    int previousyear = now1.getYear()-1;
    int yearfrom = from.getYear()+1900;

        if((yearfrom == year )|| (yearfrom == previousyear )){
            idoc.setBauinfoArzvon(from); 
        }
}

Я его немного переписал, поэтому мы прекратим использовать устаревший метод.Это выглядит так:

for (Date from : infoFacade.getDateFrom(documentId))
{
    cal.setTime(from);
    int yearfrom = cal.get(Calendar.YEAR);
    if ((yearfrom == LocalDate.now().getYear())
       || (yearfrom == (LocalDate.now().getYear() - 1)))
    {
        idoc.setDateFrom(from);
    }
}

Я беспокоюсь обо всех этих вещах +1900 или -1900.Должен ли я добавить или вычесть что-то из переменной yearfrom, чтобы получить те же результаты, что и в коде перед рефакторингом?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Я написал простой тест:

public static void main(String[] args) {
        Date date = new GregorianCalendar().getTime();
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);
        System.out.println(cal.get(Calendar.YEAR));
        System.out.println((LocalDate.now().getYear() - 1));
        System.out.println(LocalDate.now().getYear());
        LocalDate now1 = LocalDate.now();
        int year = now1.getYear();
        int previousyear = now1.getYear()-1;
        int yearfrom = date.getYear()+1900;
        System.out.println(year);
        System.out.println(previousyear);
        System.out.println(yearfrom);
    }

Результат этого теста:

2018
2017
2018
2018
2017
2018

Итак, оба примера кода дают одинаковый результат.

НО я постараюсь использовать @Ole V.V. ответь завтра, чтобы увидеть, что произойдет.

0 голосов
/ 08 ноября 2018

Если вы не можете изменить тип возврата 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...