为什么我不能通过这种方式从时间戳中清除时间:
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
?
答案 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()));
现在这样你可以拥有另一个日期,然后比较它......因为它们现在是字符串格式。