LocalTime.MIDNIGHT 与 LocalTime.MIN - 有啥区别吗?
Posted
技术标签:
【中文标题】LocalTime.MIDNIGHT 与 LocalTime.MIN - 有啥区别吗?【英文标题】:LocalTime.MIDNIGHT vs. LocalTime.MIN - is there any difference?LocalTime.MIDNIGHT 与 LocalTime.MIN - 有什么区别吗? 【发布时间】: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
常量。直到第二天开始,这一天才结束,一天的结束应该表示为第二天的开始,专有。
【参考方案1】:
MIN
的存在是为了提供最小值,与其他java.time.*类一致。
MIDNIGHT
的存在是为了向开发人员提供语义含义,并作为向 Javadoc 读者表明午夜被认为是一天的开始(而不是结束)的地方。
总之,代码阅读中的语义优势超过了额外常量的成本。
(来源:我是java.time.*的主要作者)
【讨论】:
谢谢!很高兴从真正编写该代码(或参与编写该代码)的人那里阅读基本原理。以上是关于LocalTime.MIDNIGHT 与 LocalTime.MIN - 有啥区别吗?的主要内容,如果未能解决你的问题,请参考以下文章