【发布时间】:2021-09-01 00:30:02
【问题描述】:
我最近使用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);
}
与我的预期相反,此方法使用LocalTime.MIDNIGHT 而不是LocalTime.MIN 返回LocalDateTime。
当然,我打开OpenJDK source of 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作为一天的开始?
只是为了在某些情况下更具可读性吗?
但是为什么LocalTime.atStartOfDay() 中不使用MIN 而使用LocalTime.MIDNIGHT?
【问题讨论】:
-
直观地说,你不同意“一天从午夜开始”这句话比“一天从午夜开始”更自然很多支持的最低本地时间”?另外,至少对我来说,一天结束的时间与第二天开始的时间相同,而不是 23:59:59。
-
我同意这一点,@Sweeper,但这并不能解释两个值相同的常量的存在。仅当目的是为不同的文化提供可读的常量时。可能在世界某个地方,人们认为
MIDNIGHT是一天的结束,而在其他地方,人们认为它是一天的开始,而您将其视为两者兼而有之。好的,这将被视为自然,具体取决于位置、文化或可能只是心情。从数学的角度来看,MIN和MAX就足够了,我认为(是的,NOON将被允许留下)。全世界的数学都是一样的;-) -
坦率地说,我希望有一个名为
START_OF_DAY的常量。对我来说,这更精确为MIDNIGHT(不是以英语为母语的人)。并且使用半开间隔我会反对END_OF_DAY常量。直到第二天开始,这一天才结束,一天的结束应该表示为第二天的开始,专有。
标签: java datetime java-time localdate localtime