java.text.ParseException:无法解析的日期:"1901-01-01 00:00:00"

Jua*_*par 6 java linux simpledateformat java.util.date

这段代码在Windows中正常工作,但在Linux中抛出java.text.ParseException:

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);
Run Code Online (Sandbox Code Playgroud)

Windows输出:

Tue Jan 01 00:00:00 CET 1901
Run Code Online (Sandbox Code Playgroud)

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)
        ...
Run Code Online (Sandbox Code Playgroud)

如果删除该df.setLenient(false)行,则Windows输出相同,并且Linux异常消失,但Linux输出似乎不正确:

Tue Jan 01 00:14:44 CET 1901
Run Code Online (Sandbox Code Playgroud)

有人知道发生了什么吗?

谢谢

配置:
Windows:Win7 + jdk1.7.0_71
Linux:Ubuntu + jdk1.7.0_60

编辑:正如anolsi所说,这是一个夏令时问题.使用日期"2015-03-29 02:00:01",在Windows和Linux中抛出了解析异常,因为马德里不存在此日期(时间从马德里凌晨2:00更改为凌晨3:00那天).所以正确的行为是Linux.Windows JDK应抛出异常.

ano*_*lsi 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();
    }

  }
}
Run Code Online (Sandbox Code Playgroud)

编辑2:请看一下有关时区和抵消的好文章:https://stackoverflow.com/tags/timezone/info