Как лучше всего проанализировать дату в формате MM / DD / YY и настроить ее на текущий / предыдущий век? - PullRequest
10 голосов
/ 30 октября 2008

Один из наших клиентов хочет иметь возможность вводить дату только с 2 цифрами для компонента года. Дата будет в прошлом, поэтому мы хотим, чтобы она работала в предыдущем столетии, если год с двумя цифрами находится после текущего года, но работает в текущем столетии, если год с двумя цифрами равен или меньше текущего года.

на сегодня 10/30/2008

01/01/01 = 01/01/2001

01/01/09 = 01/01/1909

Это странное требование, и я решил проблему, мне просто не нравится мое решение. Такое ощущение, что есть лучший способ сделать это.

Спасибо за помощь.

public static String stupidDate(String dateString)
{
    String twoDigitYear = StringUtils.right(dateString, 2);
    String newDate = StringUtils.left(dateString, dateString.length() - 2);
    int year = NumberUtils.toInt(twoDigitYear);
    Calendar c = GregorianCalendar.getInstance();
    int centuryInt = c.get(Calendar.YEAR) - year;
    newDate = newDate + StringUtils.left(Integer.toString(centuryInt), 2) + twoDigitYear;
    return newDate;
}

Ответы [ 7 ]

10 голосов
/ 31 октября 2008

Groovy-скрипт (достаточно простой для броска в java), демонстрирующий точку зрения @bobince на SimpleDateFormat.

import java.text.SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat('MM/dd/yy')
SimpleDateFormat fmt = new SimpleDateFormat('yyyy-MM-dd')

Calendar cal = Calendar.getInstance()
cal.add(Calendar.YEAR, -100)
sdf.set2DigitYearStart(cal.getTime())

dates = ['01/01/01', '10/30/08','01/01/09']
dates.each {String d ->
  println fmt.format(sdf.parse(d))
}

Урожайность

2001-01-01
2008-10-30
1909-01-01
9 голосов
/ 30 октября 2008

SimpleDateFormat уже выполняет двузначный разбор года для вас, используя двухбуквенный формат «yy». (Очевидно, он по-прежнему будет содержать четыре цифры.)

По умолчанию он использует сейчас-80 → сейчас + 20, так что это не совсем то правило, которое вы предлагаете, но оно разумно и стандартизировано (по крайней мере, в мире Java) и может быть переопределено с помощью set2DigitYearStart (), если вы хотите .

DateFormat informat= new SimpleDateFormat("MM/dd/yy");
DateFormat outformat= new SimpleDateFormat("MM/dd/yyyy");
return outformat.format(informat.parse(dateString));

В более долгосрочной перспективе попытайтесь перейти на форматирование даты ISO8601 (yyyy-MM-dd), поскольку MM / dd / yy является приблизительно наихудшим возможным форматом даты и обязательно вызовет проблемы в конечном итоге.

8 голосов
/ 30 октября 2008

Как насчет этого:

public static String anEasierStupidDateWithNoStringParsing(String dateString) {
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy");

    //handling ParseExceptions is an exercise left to the reader!
    Date date = df.parse(dateString);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);

    Calendar now = Calendar.getInstance();
    if (cal.after(now)) {
        cal.add(Calendar.YEAR, -100);
    }

    return cal;
}

Другими словами, позвольте SimpleDateFormat разобрать строку и просто настроить год, чтобы быть предыдущим веком, если SimpleDateFormat (, у которого есть свои собственные правила для интерпретации строк года ), возвращает дату после текущей даты ,

Это гарантирует, что все возвращенные даты остались в прошлом. Тем не менее, он не учитывает даты, которые могут быть проанализированы как до в этом прошлом веке - например, в формате MM/dd/yyyy, строка даты, такая как «01/11/12», анализирует на январь 11, 12 н.э.

5 голосов
/ 30 октября 2008

Если опция Joda Time выбрана:

String inputDate = "01/01/08";
// assuming U.S. style date, since it's not clear from your original question
DateTimeFormatter parser = DateTimeFormat.forPattern("MM/dd/yy");
DateTime dateTime = parser.parseDateTime(inputDate);
// if after current time
if (dateTime.isAfter(new DateTime())) {
    dateTime = dateTime.minus(Years.ONE);
}

return dateTime.toString("MM/dd/yyyy");

Я знаю, что Joda Time не является частью Java SE, и, как я уже говорил в другом потоке, я обычно не одобряю использование сторонней библиотеки, когда есть библиотека Java, которая делает то же самое. Однако тот, кто разрабатывает Joda Time, также возглавляет JSR310 - API даты и времени, который превратит его в Java 7. Поэтому я, Joda Time, в основном буду в будущих выпусках Java.

0 голосов
/ 31 октября 2014

Год разворота в Joda-Time

Отличная библиотека Joda-Time 2.5 включает эту функцию. Нет необходимости писать код самостоятельно. Просто позвоните withPivotYear() на DateTimeFormatter. См. В этом связанном документе примеры того, как его использовать.

0 голосов
/ 30 октября 2014
Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString);
String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate);

Работая на меня.

0 голосов
/ 31 октября 2008

Лучший способ - использовать Joda Time API для дат и времени в Java.

...