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

Как контролировать SimpleDateFormat синтаксический анализ до 19xx или 20xx?

Есть ли способ проанализировать следующую строку даты как July 23 1916, а не July 23 2016?

System.out.println(new SimpleDateFormat("yy/MM/dd", Locale.US).parse("16/07/23"));
4b9b3361

Ответ 1

В документе Java Doc (http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html) говорится:

Для синтаксического анализа с сокращенным шаблоном года ( "y" или "yy" ) SimpleDateFormat должен интерпретировать сокращенный год относительно некоторого века. Это делается путем корректировки дат в течение 80 лет до и 20 лет с момента создания экземпляра SimpleDateFormat. Например, используя шаблон "MM/dd/yy" и экземпляр SimpleDateFormat, созданный 1 января 1997 года, строка "01/11/12" будет интерпретирована как 11 января 2012 года, а строка "05/04/64" будет интерпретироваться как 4 мая 1964 года.

Метод SimpleDateFormat.set2DigitYearStart(Date) можно использовать для фиксации года.

Ответ 2

Если я понимаю ваш вопрос, то да,

SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd", Locale.US);
Calendar cal = Calendar.getInstance(Locale.US);
cal.set(1900, 0, 1);
sdf.set2DigitYearStart(cal.getTime());
System.out.println(sdf.parse("16/07/23"));

В SimpleDateFormat.set2DigitYearStart(Date) javadoc,

Устанавливает 100-летний период, состоящий из двухзначных лет, будет интерпретироваться как начинающийся с даты, указанной пользователем.

Ответ 3

Для этого может использоваться метод set2DigitYearStart. Он позволяет указать дату начала. Синтаксическая дата будет находиться в интервале [дата начала, дата начала + 100 лет].

Подробнее см. .

Ответ 4

Возможно, вы ищете это.

    Calendar cal = Calendar.getInstance();
    cal.set( Calendar.YEAR, 1900 );
    SimpleDateFormat format = new SimpleDateFormat( "yy/MM/dd", Locale.US );
    format.set2DigitYearStart( cal.getTime() );
    System.out.println( format.parse( "16/07/23" ) );