2012-03-22 21 views
10

Tôi nhận được lỗi lạ nhất, khi cố gắng phân tích cú pháp chuỗi dưới dạng lịch. Dường như nó làm hỏng đối tượng Date mà tôi sử dụng để đặt thời gian của lịch kết quả. Lỗi là khá không phù hợp (hoặc tôi không thấy logic trong đó). Bất cứ ai có thể chỉ ra những gì tôi có thể làm sai?Nhận dữ liệu sai khi sử dụng SimpleDateFormat.parse()

public class caltest{ 
public static final SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS"); 

public static void main(String[] args) { 
    String date1 = "1992-03-11 12:00:12.123"; 
    String date2 = "1993-03-11 12:00:12.123"; 
    String date3 = "1994-03-11 12:00:12.123"; 
    String date4 = "1995-03-11 12:00:12.123"; 
    parseStringAsCalendar(date1); 
    parseStringAsCalendar(date2); 
    parseStringAsCalendar(date3); 
    parseStringAsCalendar(date4); 
} 
public static String calendarToString(Calendar cal) { 
    return sdf.format(cal.getTime()); 
} 

public static Calendar parseStringAsCalendar(String s) { 
    Date time = null; 
    try { 
     time = sdf.parse(s); 
    } catch (ParseException e) { 
     System.out.println("Exception"); 
     e.printStackTrace(); 
    } 
    System.out.println(time.toString()); 
    GregorianCalendar ret = new GregorianCalendar(); 
    ret.setTime(time); 

    return ret; 
} 

}

Đầu ra là:

Sun Dec 29 12:00:12 CET 1991 
Sun Dec 27 12:00:12 CET 1992 
Sun Dec 26 12:00:12 CET 1993 
Sun Jan 01 12:00:12 CET 1995 

Trả lời

18

Bạn đang sử dụng YYYY trong specifier định dạng của bạn, đó là tuần năm (như của Java 7, tôi tin). Bạn muốn yyyy, chỉ là "năm". (Xem SimpleDateFormat documentation.)

Tôi nghi ngờ phần còn lại của ngày đã hết vì bạn đã cố gắng chỉ định tháng và ngày, không thực sự là "tính năng" trong năm trong tuần ... nếu bạn đã chỉ định các "tuần năm tuần" và ngày trong tuần, nó có thể đưa ra một số kết quả hợp lý hơn, nhưng chỉ khi bạn thực sự nghĩa sử dụng năm tuần, mà tôi nghi ngờ :)

+0

Cả hai câu trả lời là rất hữu ích, chương trình này tỏa sáng nhiều hơn một ánh sáng trên vấn đề tiềm ẩn. Tôi đã kiểm tra tài liệu sai. – Tegi

+3

bạn vừa lưu tôi từ vài giờ tìm kiếm không có trái cây trên internet! cảm ơn bạn – KoW

+0

Sự khác biệt chính xác giữa năm * năm * và * * là gì? Tài liệu này hơi thưa thớt về sự khác biệt này (cũng như tài liệu cho Lịch). – tytk

3

sử dụng này:

public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 

Trường hợp thấp hơn y trong năm, không phải chữ hoa Y. Cùng với đó, kết quả là:

Wed Mar 11 12:00:12 EST 1992 
Thu Mar 11 12:00:12 EST 1993 
Fri Mar 11 12:00:12 EST 1994 
Sat Mar 11 12:00:12 EST 1995 

Xem ở đây: