2013-05-20 25 views
12

Abbiamo iniziato a riscontrare un bizzarro errore nell'ambiente di produzione di recente (gli ambienti di test funzionano correttamente).java dateformat carattere modello non valido 'y'

java.lang.IllegalArgumentException: illegale carattere del modello 'y'

Ciò è causato dalla seguente codice

SimpleDateFormat dateFormat = (SimpleDateFormat)DateFormat.getDateInstance(); 
dateFormat.applyLocalizedPattern("yyyy-MM-dd"); 

Questo errore è normalmente generata quando per esempio con 'Y' invece di 'y ' per anno. Questo non è il caso qui come puoi vedere sopra. Non sono sicuro al 100% della locale impostata sul server. Linux env LANG è impostato su "de_DE.UTF_8", quindi probabilmente è usato.

Inserendo il codice sorgente di SimpleDateFormat.java ho trovato il metodo translatePattern(String pattern, String from, String to). Ciò genera l'eccezione menzionata quando nessun carattere in pattern non esiste in da. I valori si presenta come questo durante il debug localmente su un computer diverso

modello = "yyyy-MM-dd"
from = "GyMdkHmsSEDFwWahKzZ"

Da l'eccezione sul server, è evidente che il primo 'y 'non esiste in from. from viene prelevato da formatData.getLocalPatternChars(), che è un DateFormatSymbols inizializzato dalla locale sul server.

Sono disponibili anche versioni locali che potrebbero avere formati senza 'y'? Questo errore si è verificato senza alcuna modifica del codice e, a mia conoscenza, nessuna modifica della configurazione del server.

+0

Qual è la JVM precisa in cui si esegue? –

+0

java.vm.specification.vendor: Sun Microsystems Inc. java.runtime.version: 1.6.0_37-b06 –

+0

Ed è identico a quello in esecuzione nel test? –

risposta

11

Dal javadoc SimpleDateFormat:

SimpleDateFormat supporta anche la data localizzato e modalità temporali stringhe. In queste stringhe, le lettere di modello descritte sopra possono essere sostituite da altre lettere di modello dipendenti da locale dipendenti dalle impostazioni locali .

Nel tuo caso, il locale è DE, quindi il modello localizzato sarebbe jjjj-MM-tt. J sta per Jahr e T per Tage.

Se non si desidera gestire il modello localizzato, utilizzare solo SimpleDateFormat.applyPattern("yyyy-MM-dd").

+0

Grazie, penso di aver appena trovato l'errore ... Abbiamo impostato il server locale in tedesco, ma lo sostituisce in svedese in un servlet di init. Penso che l'initalizzazione potrebbe essersi interrotta quando la produzione è stata riavviata ieri, e siamo rimasti bloccati con le impostazioni locali tedesche! –

+0

http://stackoverflow.com/a/10731242/2105986 potrebbe essere il problema per alcuni. – faizal

7

Idealmente si dovrebbe applicare impostazioni locali del modello, altrimenti il ​​vostro modello avrebbe bisogno di cambiare per i diversi locali come aaaa lavora per en_US, jjjj per de_DE ecc, invece specificare solo aaaa e locale come en_US indipendentemente dalla localizzazione della vostra macchina.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); 
System.out.println(format.format(new java.util.Date())); 

Come javadoc dice:

Costruisce un SimpleDateFormat utilizzando il modello dato e il default simboli formato della data per la data locale. Nota: questo costruttore potrebbe non supportare tutte le versioni locali. Per una copertura completa, utilizzare i metodi di fabbrica in nella classe DateFormat.

Parametri:

modello: il modello che descrive il formato della data e l'ora

locale: il locale la cui data di formattare i simboli devono essere utilizzati

in questo modo non si dispone di preoccuparsi di quale stringa locale scegliere per le impostazioni internazionali di runtime e applicare una specifica localizzazione una volta.

+0

Sì, sono d'accordo, il codice che ho citato è del 2007 e non è stato codificato da me. Applichiamo le impostazioni locali sul nostro server, ma un'integrazione non riuscita ha provocato l'arresto anomalo dell'inizializzazione prima che venisse chiamato locale.setDefault (nuova Locale ("sv", "SE"), causando l'utilizzo predefinito del server tedesco :) –

+0

Se si sono per mantenere detto codice, si consiglia di rendere gli errori di inizializzazione fatali, quindi l'applicazione si rifiuta di funzionare. –

Problemi correlati