Java SimpleDateFormat возвращает неожиданный результат - PullRequest
15 голосов
/ 01 августа 2011

Я пытаюсь использовать SimpleDateFormat Java для анализа строки на сегодняшний день с помощью следующего кода.

public class DateTester {

    public static void main(String[] args) throws ParseException {
        String dateString = "2011-02-28";

        SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");

        System.out.println(dateFormat.parse(dateString));
    }
}

Я ожидал ошибки синтаксического анализа. Но что интересно, он печатает следующую строку:

Wed Jul 02 00:00:00 IST 195

Не могу объяснить это. Кто-нибудь может помочь?

Спасибо

Ответы [ 3 ]

23 голосов
/ 01 августа 2011

По умолчанию SimpleDateFormat является снисходительным, поэтому для его сбоя необходимо выполнить:

dateFormat.setLenient( false ) ;

до разбора даты. Затем вы получите исключение:

java.text.ParseException: Unparseable date: "2011-02-28"
22 голосов
/ 01 августа 2011

SimpleDateFormat проанализировал 2011 как месяц число 2011, потому что месяц (MM) является первой частью шаблона даты.

Если вы добавляете 2011 месяц к28-й год, вы получите 195.

2011 год - 167 лет и 7 месяцев.Июль седьмой месяц.Вы указали 02 как день, 28 как год, 28 + 167 = 195, поэтому 02 July 195 является правильным.

5 голосов
/ 01 августа 2011

Звоните setLenient(false) в формате даты.Затем вы получите исключение для синтаксического анализа, например:

groovy:000> df = new java.text.SimpleDateFormat("MM-dd-yyyy")
===> java.text.SimpleDateFormat@ac880840
groovy:000> df.setLenient(false)
===> null
groovy:000> df.parse("2011-02-28")
ERROR java.text.ParseException:
Unparseable date: "2011-02-28"
        at java_text_DateFormat$parse.call (Unknown Source)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

Богемский - это правильно, если вы не установите свойство lenient, JDK будет наклоняться назад, чтобы понять, какой мусор он дает:

groovy:000> df = new java.text.SimpleDateFormat("MM-dd-yyyy");
===> java.text.SimpleDateFormat@ac880840
groovy:000> df.parse("13-01-2011")
===> Sun Jan 01 00:00:00 CST 2012
groovy:000> df.setLenient(false)
===> null
groovy:000> df.parse("13-01-2011")
ERROR java.text.ParseException:
Unparseable date: "13-01-2011"
        at java_text_DateFormat$parse.call (Unknown Source)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...
...