标准化UTC日期

时间:2019-03-19 12:49:42

标签: java date utc milliseconds

我正在尝试阅读代码段,但对我来说没有任何意义。请帮助我

 /**
 * To make it easy to query for the exact date, we normalize all dates that go into
 * the database to the start of the day in UTC time.
 *
 * @param date The UTC date to normalize
 *
 * @return The UTC date at 12 midnight
 */
 public static long normalizeDate(long date) {
    // Normalize the start date to the beginning of the (UTC) day in local time
    long retValNew = date / DAY_IN_MILLIS * DAY_IN_MILLIS;
    return retValNew;
}

此函数接受UTC转换的以毫秒为单位的本地日期,现在我不知道该函数实际上在做什么,它被注释为“将本地时间的开始日期标准化为(UTC)日的开始时间”,这一切都没有对我来说毫无意义。请任何人帮助我。

2 个答案:

答案 0 :(得分:2)

在Java和其他编程语言中,时间点有时表示为自1970年1月1日UTC 00:00:00 UTC的 epoch 以来的毫秒数(不包括leap秒)。如评论所述,您的方法采用这样的数字并将其转换为UTC中的一天的开始(午夜)。例如,表示2019年3月20日世界标准时间的long值将转换为表示2019年3月20日世界标准时间00:00:00的值。如果从一开始该值仅表示日期,而不是一天中的某个时间,那么我认为将其描述为“正常化”是有意义的。

这是如何工作的? date(保存毫秒的long变量)首先除以一天中的毫秒数(我想;我正在阅读DAY_IN_MILLIS为“ 1天(以毫秒为单位)”)。这给出了自纪元以来的天数。除法的其余部分将被丢弃;你只有整天。然后,当再次乘以DAY_IN_MILLIS时,您将转换回毫秒。由于该日期在当天定义为00:00:00,因此您在开始时的同一日期获得00:00:00 UTC。由于UTC没有夏令时(DST)和其他时间异常(在有夏令时的时区中不起作用),因此可以使用此功能。

我承认,“在当地时间”对我来说也没有意义。我建议这毫无意义。

尽管我(尽管您没有问),也允许我添加它的不良代码,我也认为这是您需要询问的原因。由于通常不建议使用纪元,因此请使用毫秒数,最好通过标准API转换为开始时间。将时间点表示为毫秒计数是低级的并且对人类不友好。在调试器或日志中查看诸如1553074048964的数字时,通常不知道它是对还是错。取而代之的是,应该使用Instant,或者使用没有时间的日期而不是LocalDateInstant打印为2019-03-20T09:28:54.729Z。时间是世界标准时间(UTC),但是即使您处于不同的时区,也很难知道它是对还是错。 InstantLocalDate是来自Java.time(现代Java日期和时间API)的类。该API还具有用于各种日期和时间操作的方法,包括转换为一天的开始。

链接: Oracle tutorial: Date Time解释了如何使用java.time。

答案 1 :(得分:0)

我认为DAY_IN_MILLIS是86400000

因为日期是一个 long 整数,当您除以DAY_IN_MILLIS时,您将得到一个 long 整数没有小数部分的。< / p>

因此,当您将DAY_IN_MILLIS乘以后,会得到一个不同的数字,该数字将四舍五入为86400000的倍数。

属于同一UTC DAY的2个日期将具有相同的值。

数学示例

( 1 / 10 ) * 10   => 0 

( 9 / 10 ) * 10   => 0 

( 11 / 10 ) * 10   => 10

( 19 / 10 ) * 10   => 10