По местному времени.ПОЛНОЧЬ против По местному времени.МИН — есть ли какая-то разница?

#java #datetime #java-time #localdate #localtime

Вопрос:

Недавно я ответил на некоторые вопросы LocalDate.atStartOfDay() , используя LocalDate.atTime(LocalTime.MIN) и.
Мне было интересно, почему нет LocalDate.atEndOfDay() или что-то подобное, поэтому нужно использовать LocalDate.atTime(LocalTime.MAX) , чтобы получить самый последний момент (в нано, я думаю) этого конкретного дня.

Я взглянул на источник LocalDate и LocalTime и немного смутился этим:

 /**
 * Combines this date with the time of midnight to create a {@code LocalDateTime}
 * at the start of this date.
 * <p>
 * This returns a {@code LocalDateTime} formed from this date at the time of
 * midnight, 00:00, at the start of this date.
 *
 * @return the local date-time of midnight at the start of this date, not null
 */
public LocalDateTime atStartOfDay() {
    return LocalDateTime.of(this, LocalTime.MIDNIGHT);
}
 

Вопреки моим ожиданиям, этот метод возвращает LocalDateTime использование LocalTime.MIDNIGHT вместо LocalTime.MIN .
Конечно, я открыл исходный код OpenJDK LocalTime и был уверен, что сам найду разницу, но я обнаружил, что нет никакой разницы, кроме имени константы:

 /**
 * Constants for the local time of each hour.
 */
private static final LocalTime[] HOURS = new LocalTime[24];
static {
    for (int i = 0; i < HOURS.length; i  ) {
        HOURS[i] = new LocalTime(i, 0, 0, 0);
    }
    MIDNIGHT = HOURS[0];   // <--- == MIN
    NOON = HOURS[12];
    MIN = HOURS[0];        // <--- == MIDNIGHT
    MAX = new LocalTime(23, 59, 59, 999_999_999);
}
 

Хотя я полностью понимаю наличие NOON и MAX , я действительно не понимаю, почему есть MIN и MIDNIGHT когда, очевидно, одного из них будет достаточно, поскольку они имеют одинаковую ценность.

Может ли кто-нибудь сказать мне причину, почему…

  • … существуют две константы, имеющие одно и то же значение, и
  • … почему код используется MIDNIGHT для начала рабочего дня?

Это просто для того, чтобы в некоторых ситуациях было что-то более читабельное?
Но почему MIN он используется не в LocalTime.atStartOfDay() , а скорее LocalTime.MIDNIGHT ?

Комментарии:

1. Интуитивно , не согласитесь ли вы, что предложение «день начинается в полночь» намного более естественно, чем «день начинается по минимально поддерживаемому местному времени»? Кроме того, по крайней мере для меня, день заканчивается в то же время, что и начинается следующий день, а не в 23:59:59.

2. Я бы согласился с этим, @Sweeper, но это не объясняет наличие двух идентичных по значению констант. Только в том случае, если цель состояла в том, чтобы иметь читаемые константы для разных культур. Возможно, где-то в мире люди считают MIDNIGHT конец дня, а где-то еще люди считают его началом дня, в то время как вы рассматриваете его и как то, и как другое. Хорошо, это будет считаться естественным в зависимости от местоположения, культуры или, может быть, просто настроения. С математической точки зрения, MIN и MAX этого было бы достаточно, я думаю (да, NOON было бы разрешено остаться). И математика одинакова во всем мире 😉

3. Честно говоря, я бы хотел иметь постоянное имя START_OF_DAY . Для меня это более MIDNIGHT точно (не будучи носителем английского языка). И, используя полуоткрытые интервалы, я бы возражал против END_OF_DAY постоянной. День не заканчивается до тех пор, пока не начнется следующий день, и конец дня должен быть представлен как начало следующего дня, эксклюзивно .

Ответ №1:

MIN существует для обеспечения минимального значения, которое согласуется с другими классами java.time.*.

MIDNIGHT существует для предоставления семантического значения разработчикам и как место для указания читателям Javadoc, что полночь считается началом дня (а не концом).

Таким образом, семантические преимущества при чтении кода перевешивают стоимость дополнительной константы.

(Источник: я являюсь основным автором java.time.*)

Комментарии:

1. Спасибо! Хорошо прочитать обоснование от кого-то, кто действительно написал этот код (или участвовал в его написании).