2008-10-30 11 views
9

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

на сегодня 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; 
} 

ответ

8

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

java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat('MM/dd/yy') 
java.text.SimpleDateFormat fmt = new java.text.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)) 
} 

Yeilds

2001-01-01 
2008-10-30 
1909-01-01 
7

Как об этом:

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 (which has it's own rules for interpreting year strings) возвращает дату, которая после тока Дата.

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

5

Если Joda время вариант:

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 время не является частью Java SE, и, как я уже говорил в другом потоке, я обычно не оправдываю с использованием библиотеки сторонних когда есть библиотека Java, которая делает то же самое. Тем не менее, человек, который разрабатывает Joda Time, также возглавляет JSR310 - API даты и времени, который превратится в Java 7. Таким образом, Joda Time в основном будет в будущих выпусках Java.

+1

Вы должны использовать joda время Freaky Formatters для append2digitYear http://joda-time.sourceforge.net/userguide.html#Freaky_Formatters – 2008-10-31 17:43:03

+0

Я думал о том, чтобы делать что-то подобное, но это будет означать, что текущий год всегда будет рассматриваться как в текущем году, даже если это будет время в будущем (то есть, 12/31/08 будет 12/31/2008 вместо 12/31/1908). Я думаю, правильное решение будет зависеть от требований клиента. – 2008-10-31 21:54:14

8

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), потому что ММ/дд/гг приблизительно наихудший возможный формат даты и обязательно вызовет проблемы в конечном счете.

+0

Он сказал, что его клиент явно попросил это правило в течение 2 цифр в год. :) – 2008-10-30 20:54:33

+0

Да, если бы это было до меня, я бы сказал, что нам нужен четырехзначный год. Задача решена. – ScArcher2 2008-10-30 21:12:10

-1

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

0
Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString); 
String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate); 

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

0

кронштейне год в Joda времени

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

 Смежные вопросы

  • Нет связанных вопросов^_^