2016-01-28 15 views
6

Đoạn mã này hoạt động chính xác trong Windows, nhưng trong Linux ném một java.text.ParseException:java.text.ParseException: Unparseable date: "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); 

của Windows đầu ra:

Tue Jan 01 00:00:00 CET 1901 

Linux đầu ra:

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

Nếu loại bỏ dòng df.setLenient(false), sản lượng Windows là như nhau, một d ngoại lệ Linux biến mất, tuy nhiên đầu ra Linux có vẻ không đúng:

Tue Jan 01 00:14:44 CET 1901 

Có ai biết điều gì đang xảy ra không?

Cảm ơn

Cấu hình:
Windows: Win7 + jdk1.7.0_71
Linux: Ubuntu + jdk1.7.0_60

EDIT: Như anolsi nói là một vấn đề tiết kiệm ánh sáng. Với ngày "2015-03-29 02:00:01" ngoại lệ phân tích cú pháp được ném, trong Windows và Linux, bởi vì ngày này không tồn tại ở Madrid (thời gian đã được thay đổi từ 2:00 sáng đến 3:00 sáng tại Madrid ngày hôm đó). Vì vậy, hành vi đúng là Linux. Windows JDK nên ném ngoại lệ.

+0

Có Oracle hoặc OpenJDK trên Linux? Không nên tạo sự khác biệt nhưng chỉ trong trường hợp. – Thomas

+0

Không phải là vấn đề. Làm việc tốt cho tôi. – Optional

+0

Có thể là sự cố đã được sửa giữa u60 và u71. Thử cập nhật JDK. – Thilo

Trả lời

5

Điều đó phải liên quan đến định nghĩa Locale/múi giờ bạn đang sử dụng.

Vì bạn có thể kiểm tra theo số http://www.timeanddate.com/time/change/spain/madrid?year=1901 thời gian cụ thể không tồn tại trên Múi giờ đó, vì DST (Giờ tiết kiệm ánh sáng ban ngày). Điều này sẽ gây ra sự không thống nhất.

Nếu bạn thử thay vì 1901-02-01 00:00:00, chẳng hạn, nó sẽ hoạt động tốt.

EDIT1: Ví dụ cho phép thay đổi và kiểm soát Múi giờ.

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: Xin hãy xem trên bài viết tốt về múi giờ và offsets: https://stackoverflow.com/tags/timezone/info

+0

Vì vậy, hành vi Linux thực sự là đúng? – Thilo

+0

Tôi không hài lòng với điều này, tôi đã thử cùng một mã trong máy linux cục bộ của tôi và nó hoạt động. bạn giải thích điều đó thế nào? – Adheep

+0

Bởi vì uimezone của bạn trong Linux của bạn không nên sử dụng Múi giờ Madrid. Tôi không chắc liệu địa phương cũng sẽ đặt múi giờ không. – anolsi