#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. Спасибо! Хорошо прочитать обоснование от кого-то, кто действительно написал этот код (или участвовал в его написании).