2012-07-03 5 views
10

Beim Ausführen einiger Tests stieß ich auf das folgende Problem. Bei der Verwendung:Verwenden von DateFormat.getDateTimeInstance(). Format (Datum);

Ich fand dies produziert verschiedene Formate von Datum abhängig von der Stelle, wo die Tests laufen. So lokal in Windows/Eclipse habe ich ein Ergebnis: 04/02/12 18:18 aber auf der Linux-Box in Amerika bekomme ich 2/4/12 6:18 PM

Das verursacht meine Tests/Build fehlschlagen:

erwartet: < [04.02.12 18.18]> aber war: < [2/4/12 06.18]>

Könnte jemand dieses Verhalten erklären?

+0

Sie haben die TimeZone nicht auf jedem Server –

+0

Sorry Ich bin in GMT Zeitzone und Linux-Box ist EST – Mick

+0

Edwin Dalorzo geben Ihnen gutes Beispiel –

Antwort

14

Das ist nicht seltsam, genau so soll es funktionieren.

Die API-Dokumentation von DateFormat.getDateTimeInstance sagt:

Ruft die Datum/Zeit-Formatierungs mit dem angegebenen Datum und Uhrzeit Arten Formatierung für das Standardgebietsschema.

Das Standardgebietsschema ist auf Ihrem Windows-System anders als auf der Linux-Box in Amerika.

Wenn Sie genaue Kontrolle über das Format von Datum und Uhrzeit haben möchten, verwenden Sie SimpleDateFormat und geben Sie das Format selbst an. Zum Beispiel:

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

Noch besser wäre es, das SimpleDateFormat Objekt wieder zu verwenden, aber Vorsicht, dass es nicht Thread-sicher ist (wenn das Verfahren könnte von mehreren Threads gleichzeitig aufgerufen wird, werden die Dinge durcheinander bekommen wenn diese Threads dasselbe SimpleDateFormat Objekt verwenden).

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

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

Das Format basiert auf dem Standardgebietsschema in Ihrem Code. Wenn Sie Ergebnisse sicherstellen möchten, müssen Sie sicherstellen, dass ein bestimmtes Gebietsschema verwendet wird. Die getDateTimeInstance Methode ist überladen, um eine alternative method anzubieten, die das Gebietsschema empfängt, das Sie als Parameter verwenden möchten.

Wenn Sie in beiden Testumgebungen dasselbe Gebietsschema verwenden, sollte das Ergebnis dasselbe sein.

+0

eigentlich sollten sie nicht, da 'TimeZone.getDefault()' spielt auch eine Rolle, so dass auch gesetzt werden muss. Dies ist dennoch eine gute Antwort. – eis