18

ご想像のとおり、これにより、私のソフトウェアに Y2K スタイルのバグが発生しました。奇妙なことに、1 年ずれの計算は 1 年に 2 日しか発生しないため、トラブルシューティングの方法がよくわかりません。

出力:

03-Jan-2013
02-Jan-2013
01-Jan-2013
31-Dec-2013 ** strange
30-Dec-2013 ** strange
29-Dec-2012
28-Dec-2012
27-Dec-2012
26-Dec-2012
25-Dec-2012

Java 日付ユーティリティのどの部分でこのようなエラーが発生するのかわかりません。

コード (テストが非常に小さいため、完全な作業プログラムを含めました):

import java.util.Calendar;
import java.util.Date;
import java.text.SimpleDateFormat;

public class DateT {

        private static String getFormattedBackscanStartTime(int days) {

                SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-YYYY");
                Calendar workingDate = Calendar.getInstance();
                workingDate.add(Calendar.DATE, -1 * days);

                String formattedStartTime = dateFormat.format(workingDate.getTime());
                return formattedStartTime;
        }

        public static void main(String args[]) {

                for(int i = 35; i < 45; i++) {
                        System.out.println(getFormattedBackscanStartTime(i));
                }
        }
}
4

5 に答える 5

47

これが問題です:

"dd-MMM-YYYY"

YYYY暦年ではなく週年です。yyyy代わりに欲しい。

2012 暦年の最後の 2 日間は、2013 年の週の最初の週にありました。通常は、「年の週」指定子 ( w) と組み合わせて週の年のみを使用する必要があります。

于 2013-02-07T16:17:48.823 に答える
7

を使用していると仮定しますjava 1.7

上記のコード スニペットは、 (YYYY はjava 1.6では使用できません)SimpleDateFormat("dd-MMM-YYYY")java.lang.IllegalArgumentExceptionjava 1.6

yyyyの代わりに使用する必要がありますYYYY

Y -> week-year
y -> year

ここ

編集

素晴らしい作品yyyy:

$ java DateT
03-Jan-2013
02-Jan-2013
01-Jan-2013
31-Dec-2012
30-Dec-2012
29-Dec-2012
28-Dec-2012
27-Dec-2012
26-Dec-2012
25-Dec-2012
于 2013-02-07T16:21:51.267 に答える
3

問題は日付フォーマット文字列にあります - 年であってはなりyyyyませんYYYY

ループの各反復での値をworkingDate.getTime()出力すると、期待値が含まれていることがわかります。

Thu Jan 03 11:19:33 EST 2013
Wed Jan 02 11:19:33 EST 2013
Tue Jan 01 11:19:33 EST 2013
Mon Dec 31 11:19:33 EST 2012
Sun Dec 30 11:19:33 EST 2012
Sat Dec 29 11:19:33 EST 2012
Fri Dec 28 11:19:33 EST 2012
Thu Dec 27 11:19:33 EST 2012
Wed Dec 26 11:19:33 EST 2012
Tue Dec 25 11:19:33 EST 2012

したがって、問題は SimpleDateFormat の使用法にあります。

于 2013-02-07T16:21:02.587 に答える
2

年には小文字の y を使用する必要があります。これを試して:

   SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
于 2013-02-07T16:21:04.257 に答える