UTC日期归一化函数逻辑解析求助
解析日期归一化函数的逻辑
别担心,我帮你把这个函数拆解明白:
首先先明确一个关键前提:DAY_IN_MILLIS是一个固定常量,代表一天的毫秒数,也就是24 * 60 * 60 * 1000 = 86400000,这是理解代码的基础。
函数核心作用
这个函数的本质是把任意UTC时间的毫秒数,“归整”到该日期在UTC时区下的当天起始时刻(午夜0点)。这么做的目的是让所有入库日期统一到同一天的起点,方便后续按天做精确的日期查询——比如统计某天的所有入库数据时,不需要纠结具体的时分秒,直接用这个归一化后的时间作为查询条件就能精准匹配当天的所有数据。
代码逻辑拆解
核心代码就这一行,用了整数除法的截断特性:
long retValNew = date / DAY_IN_MILLIS * DAY_IN_MILLIS;
拆解成两步看:
- 第一步:
date / DAY_IN_MILLIS:把输入的UTC毫秒数除以一天的毫秒数,得到的是从Unix纪元(1970-01-01 UTC)到输入日期当天的总天数(整数除法会自动舍去时分秒对应的毫秒数,只保留整天数)。 - 第二步:再乘以
DAY_IN_MILLIS:把总天数转回毫秒数,得到的就是该天UTC午夜0点的毫秒数。
举个实际例子更直观:
假设输入的date是1696156800000(对应UTC时间2023-10-01 12:00:00),计算过程是:1696156800000 / 86400000 = 19631(总天数),再乘以86400000得到1696108800000,也就是UTC时间2023-10-01 00:00:00,完美回到当天的起始点。
关于注释的表述澄清
注释里“将起始日期归一化为本地时间中的UTC当天开始时刻”确实有点绕,属于表述上的小混淆。正确的理解应该是:输入的date已经是转换为UTC时间的毫秒数,函数输出的是UTC时区下该日期当天的午夜0点时刻,和“本地时间”其实没有关联,可能是注释撰写时的表述失误。
内容的提问来源于stack exchange,提问作者Mr uNiQue
相关产品推荐
相关产品推荐

