2016-08-09 64 views
0

Ich möchte die Woche und das Jahr eines Datums wie 2016/06 zurückgeben. Deshalb verwende ich den folgenden Code, um es auszuprobieren:Java Date Converting: Verschiedene Woche des Jahres zurückgegeben

public static void main(String[] args) throws ParseException { 

    DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 
    DateFormat formatWeekAndYear = new SimpleDateFormat("yyyy/ww"); 

    String articleDate = "31.12.2015 11:26:00"; 

    long keyDate = format.parse(articleDate).getTime(); 
    System.out.println("KeyDate: " + keyDate + " = " + format.format(keyDate)); 

    String formatted = formatWeekAndYear.format(keyDate); 
    System.out.println(formatted); 
} 

ich eine <Year>/<Week Of Year> Zeichenfolge für jede Eingabe Datum zurückkehren möchten, zum Beispiel 31.12.2015 11:26:00 (siehe Code).

nun das seltsame Verhalten:

ich unterschiedliche Ergebnisse erhalten, abhängig von dem Computer, den ich das Java-Programm laufen!

Hier ist der Ausgang auf meinem lokalen PC:

KeyDate: 1451557560000 = 31.12.2015 11:26:00 
2015/53 

Laufen genau das gleiche Programm auf einem entfernten Rechner erhalte ich:

KeyDate: 1451557560000 = 31.12.2015 11:26:00 
2015/01 

Warum Computer liefert A 2015/53 und die anderen 2015/01. Ich brauchte Tage, um diesen Unterschied herauszufinden, kann jemand eine Erklärung geben?

+1

wahrscheinlich eine Zeitzonenausgabe –

+1

Woche vom 31. Dezember, 2015 ist die erste Woche von 2016 daher Ihre bekommen 2015/01 s o Verwenden Sie DateFormat formatWeekAndYear = new SimpleDateFormat ("YYYY/ww"); anstelle von DateFormat formatWeekAndYear = new SimpleDateFormat ("yyyy/ww"); – Raghavendra

+0

Ah toll, das ist auch eine Lösung für das Problem! Vielen Dank! –

Antwort

2

Der Grund ist ziemlich einfach ... Sie ignorieren das Gebietsschema aber die Definition der Woche des Jahres ist 100% Gebietsschema abhängig.

Sie sollten Fall betrachten inthis eine Instanz des SimpleDateFormat mit locale zu schaffen ...

Der Grund dafür ist: der ersten Woche in den USA ist nicht die gleiche wie die erste Woche in Deutschland ..

folgende Stück Code berücksichtigen, dass die verschiedenen Ergebnisse für den gleichen Code mit verschiedenen locale ...

Beispiel erklärt:

public static void main(String[] args) { 

DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 
DateFormat formatWeekAndYear = new SimpleDateFormat("yyyy/ww"); 
DateFormat formatWeekAndYearGERMANY = new SimpleDateFormat("yyyy/ww", Locale.GERMAN); 

String articleDate = "31.12.2015 11:26:00"; 

long keyDate = 1451557560000L; 
System.out.println("KeyDate: " + keyDate + " = " + format.format(keyDate)); 

System.out.println("in USA:" + formatWeekAndYear.format(keyDate)); 
System.out.println("aber in Berlin:" + formatWeekAndYearGERMANY.format(keyDate)); 
} 

die Ausgabe wie folgt aussieht:

KEYDATE: 1451557560000 = 31.12.2015 11:26:00

in USA: 2015/01

aber in Berlin: 2015/53

+0

Dies ist die Lösung, indem ich Locale.GERMANY zu meinem DateFormatter hinzufüge, löste mein Problem! Danke, das hat meinen Tag gerettet! –

+0

Sie sind willkommen :) –

+0

Wenn Sie eine [Standard ISO 8601 Definition einer Woche] (https://en.m.wikipedia.org/wiki/ISO_week_date) möchten, verwenden Sie das [ThreeTen-Extra] (http: // www.threeten.org/threeten-extra/) ['YearWeek'] (http://www.threeten.org/threeten-extra/apidocs/org/threeten/extra/YearWeek.html) Klasse anstelle dieser lästigen alten Vermächtnis Klassen. –