2008-10-30 11 views
9

Jeden z naszych klientów chce wprowadzić datę zawierającą tylko 2 cyfry dla komponentu roku. Data będzie przeszłością, więc chcemy, aby działała ona w poprzednim stuleciu, jeśli dwuletni rok jest po bieżącym roku, ale działa na obecny wiek, jeśli dwuletni rok jest równy lub mniejszy niż rok bieżący.Jaki jest najlepszy sposób na przeanalizowanie daty w formacie MM/DD/RR i dostosowanie jej do obecnego/minionego wieku?

dzień dzisiejszy 10/30/2008

01/01/01 = 01/01/2001

01/01/09 = 01/01/1909

To dziwne wymaganie, i rozwiązałem problem, po prostu nie podoba mi się moje rozwiązanie. Wydaje się, że jest lepszy sposób na zrobienie tego.

Dzięki za pomoc.

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; 
} 

Odpowiedz

8

Groovy skrypt (łatwe wystarczy wrzucić do java) wykazując @bobince punktowy wykonany o 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 
+0

To prawie dokładnie to, co zrobiłem! Łatwo to przetłumaczyć na java. Dzięki! – ScArcher2

7

Jak o tym:

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; 
} 

Innymi słowy, niech SimpleDateFormat analizowania ciągu i po prostu dostosować lat być ubiegłego wieku czy SimpleDateFormat (which has it's own rules for interpreting year strings) zwraca datę, po prądzie data.

Gwarantuje to, że wszystkie daty zostały zwrócone w przeszłości. Nie uwzględnia to jednak żadnych dat, które mogą być analizowane jako przed w ubiegłym stuleciu - na przykład w formacie MM/dd/yyyy, ciąg daty taki jak "01/11/12" analizuje do 11 stycznia 12,

5

Jeśli Joda czas jest opcja:

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"); 

wiem Joda Czas nie jest częścią Java SE, a jak mówiłem w innym wątku, ja zwykle nie toleruje przy użyciu biblioteki innej firmy, jeśli jest biblioteka Java, która robi to samo. Jednakże, osoba, która rozwija Joda Time, jest również liderem JSR310 - API Data i Czas, który sprawi, że będzie on dostępny w Javie 7. A więc Joda Time zasadniczo będzie w przyszłych wydaniach Java.

+1

Powinieneś używać czasu Jody Freaky Formatters, aby dodać2digitRok http://joda-time.sourceforge.net/userguide.html#Freaky_Formatters –

+0

Myślałem o zrobieniu czegoś takiego, ale to oznaczałoby, że bieżący rok będzie zawsze traktowany w bieżącym roku, nawet jeśli jest to jakiś czas w przyszłości (tj. 12/31/08 będzie 12/31/2008 zamiast 12/31/1908). Myślę, że prawidłowe rozwiązanie zależy od wymagań klienta. –

8

SimpleDateFormat robi już dwucyfrowe analizy, używając dwuliterowego formatu "yy". (Oczywiście nadal będzie to cztery cyfry.)

Domyślnie używa teraz -80 → teraz +20, więc nie jest to dokładnie ta sama zasada, którą proponujesz, ale jest rozsądna i wystandaryzowana (przynajmniej w świecie Java) i można go przesłonić za pomocą metody set2DigitYearStart(), jeśli chcesz.

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

W dłuższej perspektywie, spróbuj przenieść się do formatowania daty ISO8601 (rrrr-mm-dd), ponieważ MM/dd/yy wynosi około najgorszy możliwy format daty i jest związany powodować problemy w końcu.

+0

Powiedział, że jego klient wyraźnie prosił o tę szczególną dwuletnią regułę. :) –

+0

Tak, gdyby to zależało ode mnie, powiedziałbym, że potrzebujemy czterocyfrowego roku. Problem rozwiązany. – ScArcher2

+0

Rzeczywiście - klienci są głupcami! :-) Dlatego trzeba do niego podejść podstępnie! – bobince

-1

Najlepszym sposobem jest użycie API Joda czas dla dat i czasów w Javie.

0

Pracujesz dla mnie.

+0

W jaki sposób ta odpowiedź rozwiązuje kwestię pytania o zmianę wieku? –

0

Pivot Rok W Joda-Time

Doskonała Joda-Time 2,5 biblioteka zawiera tej funkcji. Nie musisz samodzielnie pisać żadnego kodu. Po prostu zadzwoń pod numer withPivotYear() na DateTimeFormatter. Zobacz dokument połączony, aby dowiedzieć się, jak go użyć.