2013-07-18 17 views
5

Attualmente, sto avendomodo Portable per garantire che il campo anno di un DateFormat è solo due cifre

private ThreadLocal<DateFormat> shortDateFormat = new ThreadLocal<DateFormat>() { 
    @Override protected DateFormat initialValue() { 
     final DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT); 
     return format; 
    } 
}; 

Usando il mio Android 4.1, questo mi offre data nel formato (Nel mio localizzazione. Può sembrare diverso per gli altri paesi)

19/07/2013

Tuttavia, a volte mi piacerebbe avere una versione molto più breve come 19/07/13

Non voglio codificare come

gg/mm/aa

come il modo di cui sopra non sarebbe portabile su diversi paesi. Alcuni paesi, il loro mese viene prima della data.

Esiste un modo portatile per ottenerlo?

p/s Non solo ordine mese/data. Potrebbe esserci anche un altro problema. Ad esempio, la Cina usa il 19-07-13 o il 19-07-2013. Ci potrebbero essere più casi limite per altri paesi, ma non lo so.

+0

@SteveP. Si prega di condividere la soluzione con noi :) –

risposta

3
SimpleDateFormat dateFormat= (SimpleDateFormat) DateFormat.getDateInstance(); 
dateFormat.applyPattern(dateFormat.toPattern().replaceAll("y{4}", "yy")); 

Spiegazione:

applyPattern(String pattern) vale la stringa modello dato a questo formato della data.

dateFormat.toPattern() ottiene l'attuale modello

dateFormat.toPattern().replaceAll(String regex, String replacement) restituisce il modello attuale, con regex sostituito da replacement.

"y{4}" guarda attraverso il modello di formato della data per una serie di 4 y di e
"yy" dice che se si vede 4 y di, sostituirli con 2 invece.

Spero che questo abbia aiutato. In bocca al lupo.

EDIT:
Come MH ha sottolineato, dal momento che questo è per Android, è probabilmente più opportuno utilizzare:

SimpleDateFormat dateFormat = (SimpleDateFormat)  
       android.text.format.DateFormat.getDateFormat(getApplicationContext()); 

Questo dovrebbe funzionare bene, dal momento che la chiamata di metodo di cui sopra restituisce una DateFormat di java.text.DateFormat, non di android.text.format.DateFormat.

+1

Buona idea e sembra funzionare. Andando a provarlo. Grazie! –

+1

@CheokYanCheng Indipendentemente dalle impostazioni locali, questo dovrebbe funzionare, perché nonostante l'ordinamento, dal momento che stiamo usando 'applyPattern', l'anno sarà sempre rappresentato da' y', Se invece avessimo usato 'applyLocalizedPattern', non avrebbe funzionato per alcuni locali, poiché non tutti i paesi rappresentano l'anno con 'y'. –

+0

Dato che stiamo parlando di dispositivi Android, consiglio comunque di utilizzare almeno 'android.text.format.DateFormat.getDateFormat (Contesto contesto)' per ottenere un oggetto 'DateFormat'' corto 'che corrisponda alle preferenze dell'utente. –

0

Se si desidera un dispositivo portatile, anziché utilizzare l'oggetto data, è possibile invece creare un array con mese, data e anno. (Vorrei solo utilizzare l'oggetto CAL e accedere a ciascuna delle tre singolarmente)

Calendar cal = Calendar.getInstance(); 
int year =cal.get(Calendar.YEAR); 
int month = cal.get(Calendar.MONTH) + 1; 
int day= cal.get(Calendar.DAY); 


dateArray[0] = month; 
dateArray[1] = year; 
dateArray[2] = day; 
+0

La domanda riguarda la conversione della data in formato stringa appropriato. Non estraendo il singolo componente informativo dalla data stessa. –

0

ne dite di creare una mappa con i modelli localizzate basate su codice ISO e un motivo di ripiego di default nel caso in cui non si dispone di una specifica paese definito?

1

Si dovrebbe prendere uno sguardo alla funzionalità android.text.format.DateFormat prevede, in cima al java.text.DateFormat.

In particolare, il metodo seguente sarà di interesse:

Javadoc:

Ottiene il formato data corrente memorizzato come array char. L'array contiene 3 elementi (DATA, MESE e ANNO) nell'ordine specificato da preferenza di formato dell'utente. Si noti che questo ordine è appropriato solo per per le date tutte numeriche; le date di spelling (MEDIUM e LONG) saranno in genere contengono altri segni di punteggiatura, spazi o parole, non solo il giorno, mese e anno , e non necessariamente nello stesso ordine restituito qui.

In altre parole, il metodo consente di determinare quale ordine i campi di giorno, mese e anno sono, in base alle preferenze dell'utente (che trionfa locale dell'utente, se mi chiedete). Da lì dovrebbe essere abbastanza facile capire quale formato 'breve' usare; Ad esempio dd/MM/yy o MM/dd/yy.

Come sottolineato dalla documentazione, il valore di ritorno del metodo è utile solo nel contesto di rappresentazioni di date tutte numeriche. Questo dovrebbe andare bene nel tuo caso.

+0

Ma questo è un altro problema, alcuni paesi come la Cina, usano il 19-07-13 o il 19-07-2013. Ci potrebbero essere più casi limite per altri paesi, ma non lo so. –

+0

@CheokYanCheng Credo di aver trovato una soluzione. –

Problemi correlati