2016-01-28 25 views
6

Dieses Stück Code funktioniert einwandfrei in Windows, aber in Linux wirft einen java.text.ParseException:java.text.ParseException: unparseable Datum: "1901.01.01 00:00:00"

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", new Locale("es", "ES")); 
df.setLenient(false); 
Date date = df.parse("1901-01-01 00:00:00"); 
System.out.println(date); 

Windows-Ausgabe:

Tue Jan 01 00:00:00 CET 1901 

Linux Ausgabe:

Exception in thread "main" java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at com.simontuffs.onejar.Boot.run(Boot.java:340) 
     at com.simontuffs.onejar.Boot.main(Boot.java:166) 
Caused by: java.text.ParseException: Unparseable date: "1901-01-01 00:00:00" 
     at java.text.DateFormat.parse(DateFormat.java:357) 
     ... 

Wenn ein Entfernen der df.setLenient(false) Linie, ist die Windows-Ausgabe gleich, ein d die Linux-Ausnahme verschwindet, die Linux-Ausgabe scheint jedoch falsch zu sein:

Ist jemand wissen, was vor sich geht?

Dank

Konfiguration:
Fenster: Win7 + jdk1.7.0_71
Linux: Ubuntu + jdk1.7.0_60

EDIT: Wie anolsi Problem ein Sommer sagte ist. Mit dem Datum "2015-03-29 02:00:01" wird die Parse-Ausnahme ausgelöst, in Windows und Linux, weil dieses Datum in Madrid nicht existiert (die Zeit wurde in Madrid von 2:00 Uhr auf 3:00 Uhr morgens geändert) dieser Tag). Das richtige Verhalten ist also das Linux-Verhalten. Das Windows JDK sollte die Ausnahme auslösen.

+0

Ist es Oracle oder OpenJDK auf Linux? Sollte keinen Unterschied machen, aber nur für den Fall. – Thomas

+0

Sollte kein Problem sein. Funktioniert gut für mich. – Optional

+0

Könnte ein Problem sein, das zwischen u60 und u71 behoben wurde. Versuchen Sie, das JDK zu aktualisieren. – Thilo

Antwort

5

Das sollte mit der Definition von Locale/Timezone verwandt sein, die Sie verwenden.

Wie Sie überprüfen können unter http://www.timeanddate.com/time/change/spain/madrid?year=1901, dass bestimmte Zeit nicht auf dieser Zeitzone, weil die Sommerzeit (DST) existiert. Dies sollte die Inkonsistenz verursachen.

Wenn Sie stattdessen 1901-02-01 00:00:00 versuchen, sollte es zum Beispiel funktionieren.

EDIT1: Beispiel für das Ändern und Steuern der Zeitzone.

import java.text.SimpleDateFormat; 
import java.text.DateFormat; 
import java.util.Locale; 
import java.util.TimeZone; 
import java.util.Date; 

public class MainClass 
{ 
    public static void main(String[] args) 
    { 
    try { 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", new Locale("es", "ES")); 
     df.setTimeZone(TimeZone.getTimeZone("Europe/Madrid")); 
     df.setLenient(false); 
     Date date = df.parse("1901-01-01 00:00:00"); 
     System.out.println(date); 
    } catch(Exception ex){ 
     ex.printStackTrace(); 
    } 

    } 
} 

EDIT2: Bitte nehmen Sie sich einen Blick auf die guten Artikel über Zeitzonen und Offsets: https://stackoverflow.com/tags/timezone/info

+0

Also ist das Linux-Verhalten eigentlich das richtige? – Thilo

+0

Ich bin nicht damit zufrieden, ich habe den gleichen Code in meinem lokalen Linux-Rechner ausprobiert und es funktioniert. Wie erklärst du das? – Adheep

+0

Weil deine Uimezone unter deinem Linux nicht die Madrid Zeitzone benutzen sollte. Ich bin mir nicht sicher, ob der Local auch die Zeitzone einstellen wird. – anolsi

Verwandte Themen