Вопрос по java – Как заставить DateFormat угадать намеченный век?

9

Я пытаюсь разобратьString в "dd-MM-yy"; отформатировать вDate объект. Проблема в том, что он пытается угадать столетие для даты.

Если указано от 01 до 31, год интерпретируется как 2000-е годы (21-й век), а 32 0 99 считается 1900-ми (20-й век).

SimpleDateFormat fm =new SimpleDateFormat("dd-MM-yy");
String datestr="21-11-31";
try {
  Date date= fm.parse(datestr);
  System.out.println(date);
} catch (ParseException e) {
}

Может кто-нибудь мне помочь? Как я могу указать, что я работаю только в 21 веке аккуратно. Я не пытаюсь искать хитрости, такие как манипулирование строкой или смещение даты в зависимости от условия.

Я считаю, что если вы хотите указать, что все даты относятся к 21-му веку, вам, скорее всего, лучше делать глупые манипуляции со строками.s/([0-9]{2}-[0-9]{2})-([0-9]{2})/$1-20$2/. zebediah49
Я реализовал это только путем обработки строк. просто думал, что может быть API способ сделать это Edge
Есть собственно :) Affe
Мне любопытно, почему ввод в коротком формате года. Можете ли вы получить вход в формате длинного года? Другим вариантом является добавление «20». в поле года, используя регулярное выражение перед анализом даты. (.replaceFirst (& quot; - (?! -) & quot ;, & quot; -20 & quot;) nhahtdh

Ваш Ответ

2   ответа
6

Отдокументация:

For parsing with the abbreviated year pattern ("y" or "yy"), SimpleDateFormat must interpret the abbreviated year relative to some century. It does this by adjusting dates to be within 80 years before and 20 years after the time the SimpleDateFormat instance is created. For example, using a pattern of "MM/dd/yy" and a SimpleDateFormat instance created on Jan 1, 1997, the string "01/11/12" would be interpreted as Jan 11, 2012 while the string "05/04/64" would be interpreted as May 4, 1964. During parsing, only strings consisting of exactly two digits, as defined by Character.isDigit(char), will be parsed into the default century. Any other numeric string, such as a one digit string, a three or more digit string, or a two digit string that isn't all digits (for example, "-1"), is interpreted literally. So "01/02/3" or "01/02/003" are parsed, using the same pattern, as Jan 2, 3 AD. Likewise, "01/02/-3" is parsed as Jan 2, 4 BC.

Кажется, он не упоминает ни одного способа настройки[-80; +20] спектр. Я подозреваю, что ваша лучшая ставка - расширить двузначный год в четырехзначную форму:

datestr = datestr.replaceFirst("-(\\d{2})$", "-20$1");
@Edge: отвечает на заголовок вашего вопроса. Вопрос о том, что он делает, сильно отличается от вопроса оchanging что оно делает.
Я понимаю это, но это действительно не отвечает на мой вопрос. Можем ли мы иметь аккуратный способ сообщить JVM, если мы работаем в конкретном веке Edge
Пусть API благословит наше понимание этих святых слов. Аминь.
Не думаю, что с SimpleDateFormat. Вы полностью можете с вашим классом EdgeDateFormat, который вы собираетесь написать, чтобы решить эту проблему ...
@ Край: см. Абзац внизу моего ответа.
12

Вы можете изменить столетие, которое он использует для интерпретации ввода двузначных данных с помощьюset2DigitYearStart() метод.

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");
String aDate = "03/17/40";
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(Calendar.YEAR, 2000);
dateFormat.set2DigitYearStart(cal.getTime());
System.out.println(dateFormat.get2DigitYearStart());
System.out.println(dateFormat.parse(aDate));

Напечатает 17 марта 2040 года.

+1 - Хорошая находка. Надеюсь, поезд upvote возвращается :)
Если вы просто рассчитаете 2000 год и сохраните его на заводе, вы можете исключить затраты на календарные операции и скрыть беспорядок. Работает в любом случае!
Я на самом деле искал это. Хотя это выглядит грязно (вероятно, я просто буду придерживаться манипуляции строк), но это отвечает на мой предполагаемый вопрос, который я не знал о get2DigitYearStart (). Thanx Edge

Похожие вопросы