Как лучше всего узнать количество дней в месяце с помощью API java.time? - PullRequest
0 голосов
/ 02 ноября 2019

Мне нужно определить количество дней в месяце, представленное месячной частью java.time.ZonedDateTime. Я придумал три способа, которые работают. Дано:

ZonedDateTime date = _some date_;

Опция 1:

int daysInMonth = date.getMonth().length(date.getChronology().isLeapYear(date.getYear()));

Опция 2:

int daysInMonth = date.getMonth().length(date.toLocalDate().isLeapYear());

Опция 3:

int daysInMonth = YearMonth.from(date).lengthOfMonth();

Я обнаружил опцию3 при проверке этого вопроса на наличие дубликатов ( Количество дней в конкретном месяце определенного года? ). Я пропускаю какие-либо другие варианты? Один из этих вариантов превосходит другой? При каких обстоятельствах проявится это превосходство?

Если я правильно читаю, первый, кажется, единственный, способный поддерживать хронологию, отличную от IsoChronology. Это не важно для рассматриваемого варианта использования, но мне нравится писать гибкий, многократно используемый код, и я бы хотел, чтобы это не упало в других ситуациях. Я не эксперт по этим альтернативным хронологиям, и я не знаю, имеют ли они високосные годы * или что-нибудь еще, что может привести к изменению продолжительности месяца. Черт, я даже не знаю, есть ли у них месяцев .

РЕДАКТИРОВАТЬ: Вариант 4, для ответа @Ole VV, ниже:

int daysInMonth = date.toLocalDate().lengthOfMonth();

1 Ответ

4 голосов
/ 02 ноября 2019
    int daysInMonth = date.toLocalDate().lengthOfMonth();

Я понимаю ваше замешательство. Есть несколько способов сделать это, и вышеупомянутый не единственный хороший способ. Особенно мне нравится ваш вариант 3 тоже. Варианты, явно включающие isLeapYear(), мне не по вкусу, я считаю их слишком низкоуровневыми, слишком ручными.

При каких обстоятельствах проявится это превосходство?

Короли читабельности и отсутствия сюрпризов. Оттуда ваше мнение по крайней мере так же хорошо, как мое. Скорее всего, вы знаете людей, которые будут поддерживать ваш код лучше, чем я.

Вы также можете сделать шаг назад и спросить себя, для чего вам нужно количество дней в месяце. Я упоминаю об этом, потому что одним из типичных примеров использования вычислений является то, что java.time сам по себе может работать лучше, чем вы, например, добавление 24 дней к дате, определение количества дней между двумя датами в разные месяцы или выяснение того, какой деньгод определенная дата. У java.time есть методы для всего этого и многих других.

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