Подтвердить что ты не робот

Почему SimpleDateFormat ( "MM/dd/yyyy" ) анализирует дату до 10/20/20128?

У меня есть этот код:

  DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
  dateFormat.setLenient(false);
  Date date = dateFormat.parse("10/20/20128");

и я ожидал бы, что вызов dateFormat.parse для выброса ParseException с года, который я предоставляю, составляет 5 символов вместо 4, как в определенном мной формате. Но по какой-то причине даже при условии, что lenient установлен на false, этот вызов возвращает объект Date из 10/20/20128.

Почему? Это не имеет большого значения для меня. Есть ли еще одна настройка, чтобы сделать ее еще более строгой?

4b9b3361

Ответ 1

20128 - год, и Java надеется, что мир так долго будет жить.

если число букв шаблона больше 2, год интерпретируется буквально, независимо от количества цифр.

Ссылка.

Если вы хотите проверить, ограничена ли дата, вы можете определить ее и проверить -

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date maxDate = sdf.parse("01/01/2099");  // This is the limit

if(someDate.after(maxDate)){            
    System.out.println("Invalid date");            
}

Ответ 2

См. javadoc

Год: Если календарь форматирования является григорианским календарем, применяются следующие правила.

  • Для форматирования, если число букв шаблона равно 2, год усечен до двух цифр; в противном случае это интерпретируется как число.
  • Для синтаксического анализа, если число букв шаблона больше 2, год интерпретируется буквально, независимо от количества цифр. Таким образом, используя шаблон "MM/dd/yyyy", "01/11/12" анализирует до 11 января 12 A.D.
  • Для синтаксического анализа с сокращенным шаблоном года ( "y" или "yy" ) SimpleDateFormat должен интерпретировать сокращенный год относительно некоторых века. Это делается путем корректировки дат в течение 80 лет до и через 20 лет после создания экземпляра SimpleDateFormat. Например, используя шаблон "MM/dd/yy" и SimpleDateFormat
    экземпляр, созданный 1 января 1997 года, строка "01/11/12" будет
    интерпретируется как 11 января 2012 года, а строка "05/04/64" будет
    интерпретируется как 4 мая 1964 года. Во время разбора только строки, состоящие из ровно две цифры, как определено Character.isDigit(char), будут анализируется в столетие по умолчанию. Любая другая числовая строка, например, строка с одной цифрой, строка из трех или более цифр или двухзначная строка это не все цифры (например, "-1" ), интерпретируется буквально.
    Таким образом, "01/02/3" или "01/02/003" анализируются по той же схеме, что и 2 января, 3 года нашей эры. Аналогично, "01/02/-3" анализируется как 2 января 4 года до нашей эры.
  • В противном случае применяются конкретные формы системы календаря. Для форматирования и разбора, если количество букв шаблона равно 4 или Более того, используется длинная форма календаря. В противном случае, календарь
    используется конкретная короткая или сокращенная форма.

Следовательно, он будет читать все символы, которые появляются после последнего / в качестве года.

Ответ 3

См. java.text.SimpleDateFormat API, буква шаблона y: для разбора, если число букв шаблона больше 2, год интерпретируется буквально, независимо от количества цифр.

Ответ 4

Используя SimpleDateFormat в java, вы можете получить ряд человекочитаемых форматов. Рассмотрим этот фрагмент кода:

        Date curDate = new Date();

        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");

        String DateToStr = format.format(curDate);
        System.out.println(DateToStr);

        format = new SimpleDateFormat("dd-M-yyyy hh:mm:ss");
        DateToStr = format.format(curDate);
        System.out.println(DateToStr);

        format = new SimpleDateFormat("dd MMMM yyyy zzzz", Locale.ENGLISH);
        DateToStr = format.format(curDate);
        System.out.println(DateToStr);

        format = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z");
        DateToStr = format.format(curDate);
        System.out.println(DateToStr);

Посмотрите на различные выходы, созданные различными форматами:

2014/05/11

11-5-2014 11:11:51

11 мая 2014 года Восточноевропейское летнее время

Вс, 11 мая 2014 23:11:51 EEST

Не стесняйтесь изменять строку формата, и вы можете получить желаемый результат.