我正在尝试阅读代码段,但对我来说没有任何意义。请帮助我
/**
* 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)日的开始时间”,这一切都没有对我来说毫无意义。请任何人帮助我。
答案 0 :(得分:2)
在Java和其他编程语言中,时间点有时表示为自1970年1月1日UTC 00:00:00 UTC的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
,或者使用没有时间的日期而不是LocalDate
。 Instant
打印为2019-03-20T09:28:54.729Z
。时间是世界标准时间(UTC),但是即使您处于不同的时区,也很难知道它是对还是错。 Instant
和LocalDate
是来自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