2016-01-28 4 views
6

Этот фрагмент кода корректно работает в Windows, но в Linux бросает java.text.ParseException:java.text.ParseException: дата не поддается синтаксическому анализу: "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:

Tue Jan 01 00:00:00 CET 1901 

Linux выход:

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) 
     ... 

Если ИЗВЛЕКИТЕ df.setLenient(false) линии, выход Windows, является тем же самым, d исключение Linux исчезает, однако вывод Linux выглядит некорректным:

Tue Jan 01 00:14:44 CET 1901 

Кто-нибудь знает, что происходит?

Благодаря

Конфигурация:
для Windows: Win7 + jdk1.7.0_71
Linux: Ubuntu + jdk1.7.0_60

EDIT: Как anolsi сказал проблема Daylight Saving. С датой «2015-03-29 02:00:01» исключение синтаксического разбора выбрано в Windows и Linux, потому что эта дата не существует в Мадриде (время было изменено с 2:00 до 3:00 в Мадриде тот день). Поэтому правильное поведение - это Linux. Windows JDK должен исключить исключение.

+0

ли это Oracle или OpenJDK на Linux? Не стоит менять ситуацию, но на всякий случай. – Thomas

+0

Не должно быть проблем. Прекрасно работает для меня. – Optional

+0

Может быть проблема, которая была исправлена ​​между u60 и u71. Попробуйте обновить JDK. – Thilo

ответ

5

Это должно быть связано с определением Locale/Timezone, которое вы используете.

Как вы можете проверить под http://www.timeanddate.com/time/change/spain/madrid?year=1901, что определенного времени в этом часовом поясе не существует, потому что DST (летнее время). Это должно вызывать несогласованность.

Если вы попробуете вместо этого 1901-02-01 00:00:00, он должен работать нормально.

EDIT1: Пример, который позволяет изменять и регулировать часовой пояс.

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: Пожалуйста, обратите внимание на хорошую статью относительно часовых поясов и смещений: https://stackoverflow.com/tags/timezone/info

+0

Итак, поведение Linux на самом деле правильное? – Thilo

+0

Я не доволен этим, я попробовал тот же код на моей локальной машине Linux, и он работает. Как ты объясняешь это? – Adheep

+0

Поскольку ваш uimezone под Linux не должен использовать часовой пояс в Мадриде. Я не уверен, будет ли местный часовой пояс. – anolsi