5

私は2つのことを理解しようとしています:

  1. 次のコードが例外をスローしないのはなぜですか (SimpleDateFormat寛大ではないため)
  2. 例外はスローしませんが、年を 0013 として解析するのはなぜですか (ここでルールを使用する代わりに、今日から +80:-20 年ルール)

これがコードです

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

public class TestDate {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        format.setLenient(false);
        Date date = format.parse("01/01/13"); // Since this only has a 2 digit year, I would expect an exception to be thrown

        System.out.println(date); // Prints Sun Jan 01 00:00:00 GMT 13

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

        System.out.println(cal.get(Calendar.YEAR)); // Prints 13
    }
}

違いがあれば、UbuntuでJava 1.6.0_38-b05を使用しています

4

4 に答える 4

3

JDK 1.6のSimpleDateFormat javadocによると、

解析では、隣接する 2 つのフィールドを分離する必要がない限り、パターン文字の数は無視されます。

作業を行うメソッドのソース コードを見ると、SimpleDateFormat.parse(String, ParsePosition)これが確認されます。obeyCount「yyyyMMdd」のように、パターンに区切り文字がない場合は true、それ以外の場合は false になる変数があります。あなたのパターンでは、パーサーは 2 つの区切り記号で区切られた 3 つの数字を探し、各位置の桁数は気にしません。

ご質問への回答:

  1. Lenient区切り文字を使用する場合は考慮されません。
  2. あなたは電話SimpleDateFormat.set2DigitYearStartをしなかったのに、なぜあなたが指示しなかったことをコードが実行する必要があるのでしょうか?
于 2013-08-08T14:15:49.857 に答える
3

SimpleDateFormat API:

解析では、パターン文字の数が 2 を超える場合、年は桁数に関係なく文字どおりに解釈されます。したがって、パターン「MM/dd/yyyy」を使用すると、「01/11/12」は西暦 12 年 1 月 11 日と解析されます。

寛大なモードでは、この日付が 02/01/12 として扱われますが、false に設定されている場合、解析は無効な日付 (01/32/12 など) に対して例外をスローします。SimpleDateFormat は Calendar を内部的に使用します。寛大さに関する詳細は Calendar API にあります。

于 2013-08-08T14:09:39.580 に答える