12

2 つの日付の時差を計算したい (「yyyyMMddHHmmss」の形式)。基本的な考え方は、最初に文字列の日付をミリ秒に変換してから時差を取得することです。

Calendar c1 = Calendar.getInstance();
c1.setTime(new SimpleDateFormat("yyyyMMddHHmmss").parse("20110327032913"));
System.out.println(c1.getTimeInMillis());
Calendar c2 = Calendar.getInstance();
c2.setTime(new SimpleDateFormat("yyyyMMddHHmmss").parse("20110327025913"));     
System.out.println(c2.getTimeInMillis());

結果:

1301189353000

1301191153000

明らかに、最初の日付は 2 番目の日付よりも遅いですが、変換されたミリ秒は小さくなっています。フォーマットに誤りはありませんか?

4

3 に答える 3

8

ミリ秒単位の 2 つのタイムスタンプの時間差は 30 分です。

1301191153000 - 1301189353000 = 1800000ms = 30 min

3 月 27 日に DST が変更されたため、時計は午前 2 時から午前 3 時まで午前 2 時に進められているため、タイムスタンプは次のようになります。

20110327032913 => 2011-03-27 03:29:13

20110327025913 => 2011-03-27 02:59:13

実際には次のように解釈されます。

2011-03-27 03:29:13

2011-03-27 03:59:13 (+1 hour from original time)

したがって、2 番目のタイムスタンプが遅くなり、ミリ秒に変換すると、最初のタイムスタンプよりも大きくなります。

于 2013-03-16T17:31:32.040 に答える
4

2011 年 3 月 27 日に夏時間が午前 2 時から午前 3 時に変更された地域にお住まいだと思います (このリンクを参照してください) 。

あなたの初めては

2011 03 27 03 29 13
yyyy MM dd HH mm ss

そしてあなたの2回目は

2011 03 27 02 59 13 // does not exist because of time change
yyyy MM dd HH mm ss

実際、2回目は次のとおりです。

           ,,
2011 03 27 03 59 13
yyyy MM dd HH mm ss

これは明らかに最初のものより 30 分遅れています (30 分前ではありません)。

于 2013-03-16T17:32:08.517 に答える
2

おそらく、このコードはあなたを助けることができます:

        Calendar c1 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));            
        Calendar c2 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));       

        c1.setTime(sdf.parse("20110327032913"));
        System.out.println(c1.getTimeInMillis());

        c2.setTime(sdf.parse("20110327025913"));     
        System.out.println(c2.getTimeInMillis());
                    System.out.println((c1.getTimeInMillis()-c2.getTimeInMillis())/(1000*60)+ " minutes");

* 問題は、文字列が UTC でない場合、時刻の変更が適用されたかどうかがわからないため、間隔が 1 時間ずれることがあります。

于 2013-03-16T17:42:28.797 に答える