从时间戳剥离时间

为什么我不能通过这种方式从时间戳中清除时间:

one day == 24 * 3600 * 1000 == 86400000 milliseconds. long ms = new Date().getTime(); //Mon Sep 03 10:06:59 CEST 2012 Date date = new Date(ms - (ms % 86400000)); 

怎么来这是Mon Sep 03 02:00:00 CEST 2012而不是Mon Sep 03 00:00:00 CEST 2012

我实际上想把它与另一个没有考虑时间的日期进行比较

为了比较日期,我建议使用JodaTime,它使用LocalDate支持此function

 LocalDate date1 = new LocalDate(); // just the date without a time or time zone LocalDate date2 = .... if (date1.compareTo(date2) <=> 0) 

注意:这将构建适合默认时区的无时区LocalDates。 只要您只谈论设置了机器默认时区的时区,这很好。 比如说你有一个CEST的时区,那么这对欧洲大部分地区来说都没问题。


使用内置的时间函数,你可以做类似的事情

 public static int compareDatesInTimeZone(Date d1, Date d2, TimeZone tz) { long t1 = d1.getTime(); t1 += tz.getOffset(t1); long t2 = d2.getTime(); t2 += tz.getOffset(t2); return Double.compare(t1 / 86400000, t2 / 86400000); } 

为什么我不能以这种方式从时间中清除时间

您正确地清除UTC中的时间部分。 Date中的毫秒值始终相对于UTC的 1970年1月1日午夜。 但是,由于Date.toString()工作方式(它始终使用系统本地时区),因此您不会以UTC Date.toString() 显示它。 请注意, Date本身没有时区概念 。 自1970年1月1日午夜UTC以来,这只是几毫秒。

如果没有指定您正在谈论的时区,“从时间戳清除时间”的概念并不合理,因为相同的时间戳将在不同的时区中具有不同的一天(甚至是日期)。

说实话,我建议使用Joda Time进行任何重要的日期/时间工作。 然后你可以创建一个显然代表“只是一个日期”的LocalDate – 从Date (或Instant )到LocalDate将使您可以轻松指定要使用的时区。

试试这个…

 Calendar c = Calendar.getInstance(); DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); String strDate = df.format(c.getTime())); 

现在这种方式你可以拥有另一个日期,然后比较它….因为它们现在是String格式。