java.text.ParseException:无法解析的日期:“1901-01-01 00:00:00”
java.text.ParseException: Unparseable date: "1901-01-01 00:00:00"
这段代码在 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);
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 输出相同,并且 Linux 异常消失,但是 Linux 输出似乎不正确:
Tue Jan 01 00:14:44 CET 1901
有人知道这是怎么回事吗?
谢谢
配置:
Windows: Win7 + jdk1.7.0_71
Linux: Ubuntu + jdk1.7.0_60
编辑:正如 anolsi 所说,这是一个夏令时问题。对于日期“2015-03-29 02:00:01”,在 Windows 和 Linux 中抛出解析异常,因为该日期在马德里不存在(时间从 2:00AM 到 3:00AM 那天在马德里)。所以正确的行为是 Linux 一个。 Windows JDK 应该抛出异常。
这应该与您使用的 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://whosebug.com/tags/timezone/info
这段代码在 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);
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 输出相同,并且 Linux 异常消失,但是 Linux 输出似乎不正确:
Tue Jan 01 00:14:44 CET 1901
有人知道这是怎么回事吗?
谢谢
配置:
Windows: Win7 + jdk1.7.0_71
Linux: Ubuntu + jdk1.7.0_60
编辑:正如 anolsi 所说,这是一个夏令时问题。对于日期“2015-03-29 02:00:01”,在 Windows 和 Linux 中抛出解析异常,因为该日期在马德里不存在(时间从 2:00AM 到 3:00AM 那天在马德里)。所以正确的行为是 Linux 一个。 Windows JDK 应该抛出异常。
这应该与您使用的 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://whosebug.com/tags/timezone/info