找到自纪元以来的秒数,模数不起作用

时间:2012-03-10 04:01:46

标签: java math operators long-integer modulus

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

public void method(Date date) {

...

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

...

}

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

我将如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

我建议您使用Joda Time库。它具有您需要的大部分与日期,时间和日历相关的功能。

答案 1 :(得分:1)

就像Ignacio已经指出的那样,date.getTime()返回自1970年1月1日以来毫秒的数量,所以你的行应该是:

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

如果您计划使用Date创建新的dayDate,请确保其具有正确的时区,例如它应该在UTC / GMT时区。否则,可能会发生这样的奇怪事情:

Date epoch = new Date(0);
System.err.println(epoch);

在我的机器上Thu Jan 01 01:00:00 CET 1970,因为我的日期默认是在CET(+1)时区创建的。因此,如果您要使用您的代码,并且您将使用您计算的长度创建一个新的Date实例,那么最终的日期不会是当天的0:00,而是在1:00。

但是,如果没有立即使用Joda Time(可能不是您项目中的选项),您可以使用日历来获取秒数:

// 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();