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) 才能获得那天的最后一刻(我认为是纳米)。

我查看了LocalDateLocalTime 的来源并对此感到有些困惑:

/**
 * 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);

虽然我完全理解 NOONMAX 的存在,但我真的不明白为什么会有 MINMIDNIGHT 显然其中一个就足够了,因为它们具有相同的值。

谁能告诉我原因...

...有两个常数具有相同的值和 ...为什么代码使用MIDNIGHT 作为一天的开始?

只是为了在某些情况下更具可读性吗? 但是为什么LocalTime.atStartOfDay() 中不使用MIN 而使用LocalTime.MIDNIGHT

【问题讨论】:

直观地说,你不同意“一天从午夜开始”这句话比“一天从午夜开始”更自然很多支持的最低本地时间”?另外,至少对我来说,一天结束的时间与第二天开始的时间相同,而不是 23:59:59。 我同意这一点,@Sweeper,但这并不能解释两个值相同的常量的存在。仅当目的是为不同的文化提供可读的常量时。可能在世界某个地方,人们认为MIDNIGHT 是一天的结束,而在其他地方,人们认为它是一天的开始,而您将其视为两者兼而有之。好的,这将被视为自然,具体取决于位置、文化或可能只是心情。从数学的角度来看,MINMAX 就足够了,我认为(是的,NOON 将被允许留下)。全世界的数学都是一样的;-) 坦率地说,我希望有一个名为 START_OF_DAY 的常量。对我来说,这更精确为MIDNIGHT(不是以英语为母语的人)。并且使用半开间隔我会反对END_OF_DAY 常量。直到第二天开始,这一天才结束,一天的结束应该表示为第二天的开始,专有 【参考方案1】:

MIN的存在是为了提供最小值,与其他java.time.*类一致。

MIDNIGHT 的存在是为了向开发人员提供语义含义,并作为向 Javadoc 读者表明午夜被认为是一天的开始(而不是结束)的地方。

总之,代码阅读中的语义优势超过了额外常量的成本。

(来源:我是java.time.*的主要作者)

【讨论】:

谢谢!很高兴从真正编写该代码(或参与编写该代码)的人那里阅读基本原理。

以上是关于LocalTime.MIDNIGHT 与 LocalTime.MIN - 有啥区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

python Cosa loca de Django

loca-user admin password simple 123456是啥意思?

vue中引入高德地图Loca数据可视化

Python 死锁现象

vue中引入高德地图Loca数据可视化

vue中引入高德地图Loca数据可视化