0

日付をミリ秒から日に変換してから、日からミリ秒に戻すと、この日付が変わるのはなぜですか?

例えば:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse("2012-06-02");
System.out.println(date);
Long dateAsDays = TimeUnit.MILLISECONDS.toDays(date.getTime());

System.out.println(
    new Date(
        TimeUnit.DAYS.toMillis(dateAsDays)
    ) );

印刷されます:

6月2日土曜日00:00:00GMT+ 03:00 2012

2012年6月1日金曜日03:00:00GMT+ 03:00 2012

この変換で月の日を保存するにはどうすればよいですか?そして、なぜこのコードが正しく機能しないのですか?

4

1 に答える 1

2

日付を数日で取得すると、日付の精度が低下します。あなたはGMT+3にいるので、12:00GMTは3:00です。TimeUnitクラスリファレンスから:

変換

public long convert(long sourceDuration、TimeUnit sourceUnit)

指定された単位の指定された期間をこの単位に変換します。より細かい粒度からより粗い粒度への変換は切り捨てられるため、精度が低下します。たとえば、999ミリ秒を秒に変換すると、結果は0になります。数値的にオーバーフローする引数を使用した粗い粒度から細かい粒度への変換は、負の場合はLong.MIN_VALUEに、正の場合はLong.MAX_VALUEに飽和します。たとえば、10分をミリ秒に変換するには、TimeUnit.MILLISECONDS.convert(10L、TimeUnit.MINUTES)を使用します。

于 2012-06-28T14:18:51.333 に答える