1

Why cannot I clear the time from a timestamp this way:

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

how come this is Mon Sep 03 02:00:00 CEST 2012 instead of Mon Sep 03 00:00:00 CEST 2012?

4

3 に答える 3

4

この方法でタイムスタンプから時間をクリアできないのはなぜですか

UTCの時間部分を正しくクリアしています。のミリ秒値Dateは常に、UTC で1970 年 1 月 1 日の午前 0 時を基準にしています。ただし、仕組み上、UTC で表示していませんDate.toString()(常にシステムのローカル タイム ゾーンを使用します)。Datea自体にはタイムゾーンの概念がないことに注意してください。これは、1970 年 1 月 1 日午前 0 時 UTC からのミリ秒数です

「タイムスタンプから時間をクリアする」という概念は、話しているタイムゾーンを指定しないと意味がありません。タイムゾーンが異なれば、同じタイムスタンプでも時刻 (さらには日付) が異なるためです。

正直に言うと、重要な日時の作業にはJoda Timeを使用することをお勧めします。LocalDate次に、明らかに「単なる日付」を表すことを意図した を作成できます。また、 Date(またはInstant) から への変換により、LocalDate使用するタイムゾーンを簡単に指定できます。

于 2012-09-03T08:23:05.433 に答える
2

実際、時刻を考慮せずに別の日付と比較したい

日付を比較するには、LocalDate でこの機能をサポートする JodaTime を使用することをお勧めします

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 に答える