1

我有以下代码尝试通过在任何一天的 00:00:00 之后删除任何秒数,以从纪元开始以秒为单位获取当前日期:

public void method(Date date) {

...

long dayDate = date.getTime() - (date.getTime() % 86400L);

...

}

出于某种原因,dayDate 只是被设置为 date.getTime(),而数学运算符在这里什么也不做。

我将如何解决这个问题?

4

2 回答 2

2

我会推荐你​​使用Joda Time库。它具有您所需要的大多数与日期、时间和日历相关的功能。

于 2012-03-10T04:15:06.110 回答
1

就像 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();
于 2012-03-10T07:52:26.940 回答