我有以下代码尝试通过在任何一天的 00:00:00 之后删除任何秒数,以从纪元开始以秒为单位获取当前日期:
public void method(Date date) {
...
long dayDate = date.getTime() - (date.getTime() % 86400L);
...
}
出于某种原因,dayDate 只是被设置为 date.getTime(),而数学运算符在这里什么也不做。
我将如何解决这个问题?
我有以下代码尝试通过在任何一天的 00:00:00 之后删除任何秒数,以从纪元开始以秒为单位获取当前日期:
public void method(Date date) {
...
long dayDate = date.getTime() - (date.getTime() % 86400L);
...
}
出于某种原因,dayDate 只是被设置为 date.getTime(),而数学运算符在这里什么也不做。
我将如何解决这个问题?
我会推荐你使用Joda Time库。它具有您所需要的大多数与日期、时间和日历相关的功能。
就像 Ignacio 已经指出的那样,date.getTime()
返回自 1970 年 1 月 1 日以来的毫秒数,因此您的行应该是:
long dayDate = date.getTime() - (date.getTime() % 86400000L);
如果您打算创建一个新Date
的 with dayDate
,请确保它具有正确的时区,例如它应该在 UTC/GMT 时区。否则,可能会发生这样的奇怪事情:
Date epoch = new Date(0);
System.err.println(epoch);
这在我的机器上给出,Thu Jan 01 01:00:00 CET 1970
因为我的日期默认是在 CET (+1) 时区创建的。因此,如果您使用您的代码并Date
使用您计算的 long 创建一个新实例,那么您最终会得到一个日期,而不是当天的 0:00,而是 1:00。
但是,无需立即使用 Joda Time(这可能不是您项目中的一个选项),您可以使用 Calendar 来获取秒数:
// Create the calendar and set the date.
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
// Set the hours, minutes, etc. to 0.
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.AM_PM, Calendar.AM);
long dayDate = calendar.getTime();