1

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

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

4

3 回答 3

4

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

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

如果不指定您正在谈论的时区,“从时间戳清除时间”的概念实际上没有意义,因为相同的时间戳在不同的时区将具有不同的时间(甚至日期)。

老实说,我建议将Joda Time用于任何重要的日期/时间工作。然后,您可以创建一个LocalDate显然表示“只是一个日期”的 a ——从 a Date(或Instant)到 a的翻译LocalDate将使您可以轻松地指定要使用的任何时区。

于 2012-09-03T08:23:05.433 回答
2

我实际上想将它与另一个日期进行比较,而不考虑一天中的时间

为了比较日期,我建议使用支持此功能的 JodaTime 和LocalDate

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);
}
于 2012-09-03T08:28:08.990 回答
0

试试这个...

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

现在这样你可以有另一个日期,然后比较它......因为它们现在是字符串格式。

于 2012-09-03T08:35:37.787 回答