Qual è il modo migliore per analizzare una data nel formato MM / GG / AA e adattarla al secolo corrente / precedente?

StackOverflow https://stackoverflow.com/questions/251535

  •  05-07-2019
  •  | 
  •  

Domanda

Uno dei nostri clienti desidera poter inserire una data con solo 2 cifre per il componente dell'anno. La data sarà nel passato, quindi vogliamo che funzioni per il secolo precedente se l'anno a 2 cifre è successivo all'anno corrente, ma per il secolo corrente se l'anno a 2 cifre è uguale o inferiore all'anno corrente.

a partire dal 30/10/2008 di oggi

01/01/01 = 01/01/2001

01/01/09 = 01/01/1909

Questo è un requisito strano, e ho risolto il problema, semplicemente non mi piace la mia soluzione. Sembra che ci sia un modo migliore per farlo.

Grazie per l'aiuto.

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;
}
È stato utile?

Soluzione

Script Groovy (abbastanza facile da inserire in Java) che dimostra il punto @boince fatto su 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))
}

I rendimenti

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

Altri suggerimenti

SimpleDateFormat esegue già l'analisi annuale a due cifre per te, utilizzando la lettera a & # 8216; yy & # 8217; formato. (Consentirà comunque quattro cifre, ovviamente.)

Di default usa now-80 & # 8594; ora + 20, quindi non è esattamente la stessa regola che proponi, ma è ragionevole e standardizzata (almeno nel mondo Java) e può essere sovrascritta usando set2DigitYearStart () se vuoi.

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

A più lungo termine, prova a migrare alla formattazione della data ISO8601 (aaaa-MM-gg), poiché MM / gg / aa è il formato data approssimativamente peggiore ed è destinato a causare problemi alla fine.

Che ne dici di questo:

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

In altre parole, lascia che SimpleDateFormat analizzi la stringa e regoli l'anno in modo che sia il secolo precedente se SimpleDateFormat ( che ha le proprie regole per l'interpretazione delle stringhe degli anni ) restituisce una data successiva alla data corrente.

Ciò garantirebbe che tutte le date restituite siano nel passato. Tuttavia, non tiene conto di alcuna data che potrebbe essere analizzata come prima del secolo scorso, ad esempio con il formato MM / gg / aaaa , una stringa di date come " 01 Senza / 11/12 " analizza l'11 gennaio 12 d.C.

Se Joda Time è un'opzione:

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

So che Joda Time non fa parte di Java SE e, come ho detto in un altro thread, di solito non perdono l'uso di una libreria di terze parti quando esiste una libreria Java che fa la stessa cosa. Tuttavia, la persona che sta sviluppando Joda Time è anche alla guida di JSR310 - l'API Date and Time che lo trasformerà in Java 7. Quindi I Joda Time sarà sostanzialmente nelle future versioni di Java.

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

Lavora per me.

Anno di rotazione in Joda-Time

L'eccellente libreria Joda-Time 2.5 include questa funzionalità. Non è necessario scrivere alcun codice da soli. Chiama semplicemente conPivotYear () su un DateTimeFormatter . Vedi quel documento collegato per esempi su come usarlo.

Il modo migliore è utilizzare l'API Joda Time per date e orari in Java.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top