2012-07-03 11 views
10

Durante l'esecuzione di alcuni test mi sono imbattuto nel seguente problema. Quando si utilizza:Utilizzo di DateFormat.getDateTimeInstance(). Format (date);

private String printStandardDate(Date date) { 
    return DateFormat.getDateTimeInstance(
     DateFormat.SHORT, DateFormat.SHORT).format(date); 
} 

Ho trovato questo prodotto diversi formati di Data a seconda della posizione in cui i test da cui provengono. Quindi localmente in windows/eclipse ho ottenuto un risultato: 04/02/12 18:18 ma sul box Linux in America ottengo il 2/4/12 6:18 PM

Ciò causa il fallimento del mio Test/Build:

previsto: < [04/02/12 18:18]> ma era: < [2/4/12 18:18]>

qualcuno potrebbe spiegare questo comportamento?

+0

Non hai assegnato il TimeZone su ciascun server –

+0

Mi spiace nel fuso orario GMT e il box Linux è EST – Mick

+0

Edwin Dalorzo ti dà il buon esempio –

risposta

14

Questo non è strano, è esattamente come dovrebbe funzionare.

La documentazione API di DateFormat.getDateTimeInstance dice:

Ottiene il formattatore di data/ora con la data e l'ora dato stili di formattazione per l'impostazione internazionale predefinita.

Le impostazioni internazionali predefinite sono diverse sul sistema Windows che sulla casella Linux in America.

Se si desidera il controllo esatto sul formato di data e ora, utilizzare SimpleDateFormat e specificare il formato da soli. Ad esempio:

private String printStandardDate(Date date) { 
    return new SimpleDateFormat("dd/MM/yy HH:mm").format(date); 
} 

Ancora meglio sarebbe riutilizzare l'oggetto SimpleDateFormat, ma attenzione che non è thread-safe (se il metodo può essere chiamato da più thread contemporaneamente, le cose avranno pasticciato se quei thread utilizzano lo stesso oggetto).

private static final DateFormat DATE_FORMAT = 
    new SimpleDateFormat("dd/MM/yy HH:mm"); 

private String printStandardDate(Date date) { 
    return DATE_FORMAT.format(date); 
} 
7

Il formato è basato sulle impostazioni internazionali predefinite nel codice. Se si desidera garantire i risultati, è necessario assicurarsi di utilizzare impostazioni locali specifiche. Il metodo getDateTimeInstance è sovraccarico per offrire un alternative method che riceve le impostazioni internazionali che si desidera utilizzare come parametro.

public static final DateFormat getDateTimeInstance(int dateStyle, 
          int timeStyle, 
          Locale aLocale) 

Se si utilizzano le stesse impostazioni internazionali in entrambi gli ambienti di test, il risultato dovrebbe essere lo stesso.

+0

in realtà non dovrebbero, poiché 'TimeZone.getDefault()' svolge anche un ruolo, quindi deve essere impostato anche. Questa è comunque una buona risposta. – eis