Календарь и список массивов: как правильно назначить дату? - PullRequest
0 голосов
/ 05 февраля 2020

ниже переменной lastDay не всегда содержит i + 1 списка. Понятия не имею почему. Я нахожусь в процессе введения Даты от Java 8. Но все же я хотел бы знать, что идет не так ... Питер (очень новичок)

// organize the intervals and split them into the years
        ArrayList<intervall> tmpIntervallList = new ArrayList<intervall>();
        Calendar lastDay = Calendar.getInstance();

        for (i = 0; i < deliveryList.size() - 1; i++) {

            Log.d(TAG, "my log comments: Intervallanfang " +
                    deliveryList.get(i).getDatumasString() +" nächstes: " + deliveryList.get(i+1).getDatumasString());
            //Beginning of the next intervall -1 is the last day of the Intervall before.
            lastDay.set(deliveryList.get(i+1).getYear(),
                    deliveryList.get(i+1).getMonth(),
                    deliveryList.get(i+1).getDay());

            //debugging
            String tmp1String = String.format("%d/%d/%d", lastDay.get(Calendar.DAY_OF_MONTH),
                    lastDay.get(Calendar.MONTH) + 1,
                    lastDay.get(Calendar.YEAR));
            Log.d(TAG, "my log comments: tmp lastday " + tmp1String );

            lastDay.add(Calendar.DATE, -1);

            //debugging
            String tmpString = String.format("%d/%d/%d", lastDay.get(Calendar.DAY_OF_MONTH),
                    lastDay.get(Calendar.MONTH) + 1,
                    lastDay.get(Calendar.YEAR));
            Log.d(TAG, "my log comments: ende intervall " + tmpString);

            intervall tmp2intervall = new intervall(deliveryList.get(i).getAmountFilled(),
                    deliveryList.get(i).getYear(),
                    deliveryList.get(i).getMonth(),
                    deliveryList.get(i).getDay(),
                    lastDay.get(Calendar.YEAR),
                    lastDay.get(Calendar.MONTH),
                    lastDay.get(Calendar.DAY_OF_MONTH));
            tmpIntervallList.add(tmp2intervall);
        }

И результат

мои комментарии в журнале: Intervallanfang 01/01/2018 nächstes: 01/02/2018

мои комментарии в журнале: tmp lastday 1/1/2018

мои комментарии в журнале: ende intervall 31 / 12/2017

мои комментарии в журнале: Intervallanfang 01/02/2018 nächstes: 01/06/2018

мои комментарии в журнале: tmp lastday 1/1/2018

мои комментарии в журнале: ende intervall 31/12/2017

мои комментарии в журнале: Intervallanfang 01/06/2018 nächstes: 01/01/2019

мои комментарии в журнале: tmp lastday 1/1 / 2019

мои комментарии в журнале: ende intervall 31/12/2018

мои комментарии в журнале: Intervallanfang 01/01/2019 nächstes: 01/01/2020

мои комментарии в журнале : tmp lastday 1/1/2020

мои комментарии в журнале: ende intervall 31/12/2019

мои комментарии в журнале: Intervallanfang 01/01/2020 nächstes: 01/06/2020

мой журнал комментарии: tmp lastday 1/1/2020

мой журнал комментариев: ende intervall 31/12/2019

мой журнал комментариев: Intervallanfang 01/06/2020 nächstes: 02/01/2021

мои комментарии в журнале: tmp lastday 2/1/2021

мои комментарии в журнале: ende intervall 1/1/2021

по запросу еще немного исходного кода

    public  intervall(int amountFilled, int yearBegin, int monthBegin, int 
               dayBegin, int yearEnd, int monthEnd, int dayEnd) {
                   begin = Calendar.getInstance();
                   end = Calendar.getInstance();
                   this.setIntervall( yearBegin, monthBegin, dayBegin, 
                          yearEnd, monthEnd, dayEnd);
                   this.amountFilled = amountFilled;

....

    public void setIntervall(int amountFilled, int yearBegin, int 
    monthBegin, int dayBegin, int yearEnd, int monthEnd, int dayEnd){
       this.begin.set(yearBegin, monthBegin, dayBegin);
       this.end.set(yearEnd, monthEnd, dayEnd);

.....

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Избегайте устаревших классов даты и времени

Вы используете ужасные классы даты и времени, которые были заменены годами на go современными java .time классами, определенными в JSR 310 Никогда не используйте Date или Calendar.

java .time

Получить сегодняшнюю дату. Часовой пояс требуется. В любой момент времени дата меняется по всему земному шару в зависимости от часового пояса.

ZoneId z = ZoneId.of( "Europe/Berlin" ) ;
LocalDate today = LocalDate.now( z ) ;

Создание строки в стандартном формате ISO 8601, ГГГГ-ММ-ДД. Обратите внимание, что java .time использует нормальную нумерацию, поэтому месяцы 1-12, нет необходимости в + 1.

String output = today.toString() ;

Чтобы добавить или вычесть дни к этой дате, звоните plusDays или minusDays. Классы java .time используют неизменяемые объекты. Поэтому вместо того, чтобы изменять оригинал, мы получаем в результате свободный sh новый LocalDate объект.

LocalDate yesterday = today.minusDays( 1 ) ;
LocalDate tomorrow = today.plusDays( 1 ) ;

ThreeTen-Extra

Я предлагаю вам добавьте в свой проект библиотеку ThreeTen-Extra . Это дает вам доступ к классу LocalDateRange для представления пары объектов LocalDate.

LocalDateRange dateRange = LocalDateRange.of( today , today.plusWeeks( 1 ) ) ;

Я предполагаю, что этот класс можно использовать вместо вашего домашнего intervall класса. Кстати, имена классов в Java должны иметь начальную заглавную букву, Intervall имя класса, intervall имя переменной экземпляра.

Этот LocalDateRange класс имеет несколько методов для сравнения, например, примыканий, содержаний, перекрытий и т. д.

boolean containsJan23 = dateRange.contains( LocalDate.of( 2020 , Month.JANUARY , 23 ) ) ;
1 голос
/ 14 февраля 2020

это не объясняет странного поведения. Как написано, я нахожусь в процессе введения даты от Java 8, но все же я хотел бы понять.

Давайте просто проверим первые две строки вашего вывода журнала для начала:

my log comments: Intervallanfang 01/01/2018 nächstes: 01/02/2018
my log comments: tmp lastday 1/1/2018

(Для читателей, которые не читают по-немецки: первая строка означает интервал, начинающийся 01.01.08, следующий: 01.02.2008.)

The даты nächstes и tmp lastday происходят из того же элемента из вашего deliveryList, а именно deliveryList.get(i+1). 01/02/2018 происходит от getDatumasString(), тогда как 1/1/2018 происходит от getYear(), getMonth() и getDay(). В выводе вы правильно добавили 1 к номеру месяца, потому что месяцы безумно пронумерованы от 0 вместо 1 (вероятно, это черта из запутанного класса GregorianCalendar). Поэтому, когда эти две даты не совпадают, проблема должна быть внутри того класса, к которому принадлежат эти поставки. Учитывая предоставленную вами информацию, я не знаю, что это за класс, и тем более, в чем заключается проблема этого класса (была причина, почему в комментарии я рекомендовал вам создать минимальный воспроизводимый пример).

Однако существует закономерность: когда мы читаем весь вывод журнала, nächstes и tmp lastday всегда согласовывают год и день месяца (даже на последней итерации, где день месяца равен 2 для изменение). И tmp lastday всегда дает месяц как 1 (январь), независимо от того, что в nächstes (2, 6 или 1). Так что может показаться, что в getMonth() есть ошибка, которая заставляет его возвращать 0 (январь) всегда, независимо от того, что находится в объекте.

Почему getMonth() всегда возвращает январь, это от меня догадки, но Смею начать угадывать. Это может произойти из-за разбора строки даты с использованием SimpleDateFormat, печально известного нарушителя класса. Есть две типичные ошибки, которые регулярно приводят к тому, что он возвращает дату в январе, даже если входная строка находится в другом месяце:

  1. Использование верхнего регистра Y вместо нижнего регистра y для года в строке шаблона формата. См., Например, java синтаксический анализ строки на сегодняшний день .
  2. Еще более вероятно, что в вашем случае используется строчная буква m для месяца. Например, SimpleDateFormat игнорирует месяц при разборе

Если какой-либо из этих двух вариантов подходит для вашей проблемы, я могу почти гарантировать вам одну вещь: это не случилось бы с java .time, современный Java API даты и времени, который Басил Бурк справедливо подтверждает в другом ответе. java .time намного лучше ловит такие ошибки задолго до того, как вам нужно будет их отладить.

Надеюсь, это продвинет вас на шаг или два дальше. Viel Glück.

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