从时间戳剥离时间

时间:2012-09-03 08:21:29

标签: java timestamp

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

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

3 个答案:

答案 0 :(得分:4)

  

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

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

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

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

答案 1 :(得分: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);
}

答案 2 :(得分:0)

试试这个......

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

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