Можно ли создать DateFormatter, который преобразует двухзначный год в четырехзначный год? - PullRequest
7 голосов
/ 28 февраля 2011

В моем Java-приложении я использую экземпляр DateFormat для разбора ввода даты.

DateFormat fmt;
fmt = DateFormat.getDateInstance(DateFormat.DEFAULT)  // dd.MM.yyyy for de_DE

Проблема в том, что пользователь настаивает на вводе даты в форме 31.12.11.

К сожалению, это анализируется до 31.12.11. (0011-12-31 в формате ISO) Вместо этого я хочу, чтобы проанализированная дата стала 31.12.2011 (2011-12-31 в формате ISO).

Могу ли я изменить формат даты, чтобы каким-то образом анализировать входные данные?

Ответы [ 6 ]

11 голосов
/ 28 февраля 2011

Вам придется анализировать с форматом dd.MM.yy и переформатировать с форматом yyyy-MM-dd

DateFormat sdfp = new SimpleDateFormat("dd.mm.yy");
Date d = sdfp.parse(input);
DateFormat sdff = new SimpleDateFormat("yyyy-MM-dd");
String date = sdff.format(d);

См. Java API для получения дополнительной информации о настройке шаблонов.

http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

5 голосов
/ 28 февраля 2011

Ваше решение здесь достаточно простое, чтобы можно было использовать SimpleDateFormat, который включает метод set2DigitYearStart(Date startDate).Возможно, это выглядит примерно так.

String userInput = "31.12.11";
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy");
format.set2DigitYearStart(new GregorianCalendar(2001,1,1).getTime());
Date userEnteredDate = format.parse(userInput, 1); // parsed to 2011-12-31
1 голос
/ 25 марта 2013

Если вы используете GWT, у вас нет доступа к SimpleDateFormat, поэтому вот код, который делает это вручную:

String[] parts = dateText.split(" ");

// Convert 2 digit date to 4 digits
if (parts.length == 3 && parts[2].length() == 2) {
    int year = Integer.valueOf(parts[2]);

    // Allow 5 years in the future for a 2 digit date
    if (year + 100 > new Date().getYear()+5) {
        year = year + 1900;
    }
    else {
        year = year + 2000;
    }
    dateText = parts[0] + " " + parts[1] + " " + String.valueOf(year);
}

Предполагается, что вы проверили, что dateText разделен пробелами.

1 голос
/ 28 февраля 2011

Вы можете проанализировать эту дату, используя SimpleDateFormat, но как вы определите, что это был 1911 или 2011 или что-то ещеВы должны использовать формат года как гггг.

1 голос
/ 28 февраля 2011

Да, вы можете анализировать, используя DateFormat.SHORT вместо DEFAULT.

Или, возможно, попробуйте разобрать с SHORT, а затем попробуйте другие форматы, если это не сработает.

0 голосов
/ 08 марта 2018

Пример:

int twoDigitYear = 11;
int fourDigitYear = 0;
DateTime now = new DateTime();

if (twoDgYear + 2000 > now().getYear()) {
   fourDigitYear = twoDigitYear + 1900;
}else{
   fourDigitYear = twoDigitYear + 2000;
}

Может или не может соответствовать вашим потребностям ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...