2013-08-30 44 views
19

tôi có mã này:Tại sao SimpleDateFormat ("MM/dd/yyyy") phân tích ngày thành 10/20/20128?

DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); 
    dateFormat.setLenient(false); 
    Date date = dateFormat.parse("10/20/20128"); 

và tôi mong chờ cuộc gọi dateFormat.parse để ném ParseException kể từ năm tôi cung cấp là 5 ký tự thay vì 4 như trong các định dạng tôi xác định. Nhưng đối với một số lý do ngay cả với các thiết lập khoan dung sai cuộc gọi này trả về một đối tượng ngày của 10/20/20128.

Tại sao lại như vậy? Nó không có ý nghĩa với tôi. Có một cài đặt nào khác để làm cho nó trở nên nghiêm ngặt hơn không?

+2

Nếu nó phân tích cú pháp thành 4 chữ số thay vì 5, thì đó không phải là năm chính xác. –

+0

Tôi tin rằng nếu bạn đang lo lắng về việc làm cho nó 4 trong đầu vào người dùng hoặc một cái gì đó là typo'd bạn sẽ phải kiểm tra xem trước khi thiết lập giá trị ngày của bạn. – sealz

+1

Tôi không muốn nó phân tích nó thành 4 chữ số, tôi muốn nó không thành công (cho tôi một ngoại lệ) vì giá trị tôi cung cấp không khớp với định dạng ngày chính xác. – goe

Trả lời

36

20128 là năm hợp lệ và Java hy vọng thế giới sẽ sống lâu đến mức tôi đoán.

nếu số lượng mẫu hoa văn lớn hơn 2, năm là diễn giải theo nghĩa đen, bất kể số chữ số.

Reference.

Nếu bạn muốn xác nhận nếu một ngày là trong giới hạn, bạn có thể xác định một và Trả phòng

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
Date maxDate = sdf.parse("01/01/2099"); // This is the limit 

if(someDate.after(maxDate)){    
    System.out.println("Invalid date");    
} 
+0

Tôi hiểu rằng, nhưng giá trị được cung cấp không khớp với định dạng MM/dd/yyyy mà tôi đã cung cấp để nó vẫn không thành công. – goe

+1

@goe java diễn giải bất cứ điều gì nhiều hơn 2 y là năm đầy đủ được cung cấp. Tôi không thể xác minh nhưng nếu bạn đã làm yyy bạn vẫn sẽ nhận được tất cả 5 số. – sealz

+1

@goe Đó là cách họ quyết định triển khai. Hãy thử điều này: System.out.println (new SimpleDateFormat ("yyyyyyyyyy dddddd MMMMMMMM"). Format (new Date())); Và bạn sẽ nhận được "0000002013 000030 August" –

7

Xem java.text.SimpleDateFormat API, mẫu thư y: Để phân tích cú pháp, nếu số lượng mẫu chữ lớn hơn 2, năm được hiểu theo nghĩa đen, bất kể số chữ số.

11

Xem javadoc

Năm: Nếu lịch của trình định dạng là lịch Gregorian, các quy tắc sau đây được áp dụng .

  • Để định dạng, nếu số chữ hoa văn là 2, năm được cắt ngắn thành 2 chữ số; nếu không thì nó được hiểu là một số.
  • Để phân tích cú pháp, nếu số lượng mẫu chữ cái lớn hơn 2, năm được hiểu nghĩa là, bất kể số chữ số. Vì vậy, sử dụng mẫu "MM/dd/yyyy", "01/11/12" phân tích cú pháp đến ngày 11 tháng 1, 12 AD
  • Để phân tích cú pháp với mẫu viết tắt năm ("y" hoặc "yy"), SimpleDateFormat phải diễn giải năm viết tắt tương ứng với một số thế kỷ . Nó thực hiện điều này bằng cách điều chỉnh ngày trong vòng 80 năm trước và 20 năm sau khi cá thể SimpleDateFormat được tạo. Ví dụ: Ví dụ: sử dụng mẫu "MM/dd/yy" và SimpleDateFormat
    phiên bản được tạo vào ngày 1 tháng 1 năm 1997, chuỗi "01/11/12" sẽ là
    được hiểu là ngày 11 tháng 1 năm 2012 trong khi chuỗi "05/04/64" sẽ là
    được hiểu là ngày 4 tháng 5 năm 1964. Trong khi phân tích cú pháp, chỉ các chuỗi gồm
    chính xác hai chữ số, như được định nghĩa bởi Character.isDigit (char), sẽ là được phân tích thành thế kỷ mặc định. Bất kỳ chuỗi số nào khác, chẳng hạn như một chuỗi số
    một chữ số, một chuỗi gồm ba chữ số trở lên hoặc một chuỗi gồm hai chữ số không phải là tất cả các chữ số (ví dụ: "-1").
    Vì vậy, "01/02/3" hoặc "01/02/003" được phân tích cú pháp, sử dụng cùng một mẫu, như
    Ngày 2 tháng 1, 3 QUẢNG CÁO.Tương tự, "01/02/-3" được phân tích cú pháp là ngày 2 tháng 1 năm 4 trước Công nguyên.
  • Nếu không, các biểu mẫu cụ thể của lịch hệ thống sẽ được áp dụng. Đối với cả định dạng và phân tích cú pháp, nếu số chữ hoa văn là 4 hoặc
    nhiều hơn, một dạng dài cụ thể theo lịch được sử dụng. Nếu không, sử dụng lịch
    biểu mẫu ngắn hoặc viết tắt cụ thể.

Do đó, nó sẽ đọc tất cả các nhân vật mà đến sau khi người cuối cùng / như năm nay.

0

Sử dụng SimpleDateFormat trong java, bạn có thể đạt được một số định dạng có thể đọc được của con người. Hãy xem xét đoạn mã này:

 Date curDate = new Date(); 

     SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); 

     String DateToStr = format.format(curDate); 
     System.out.println(DateToStr); 

     format = new SimpleDateFormat("dd-M-yyyy hh:mm:ss"); 
     DateToStr = format.format(curDate); 
     System.out.println(DateToStr); 

     format = new SimpleDateFormat("dd MMMM yyyy zzzz", Locale.ENGLISH); 
     DateToStr = format.format(curDate); 
     System.out.println(DateToStr); 

     format = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z"); 
     DateToStr = format.format(curDate); 
     System.out.println(DateToStr); 

Nhìn vào kết quả đầu ra khác nhau được tạo ra bởi các định dạng khác nhau:

2014/05/11

11-5-2014 11:11:51

Ngày 11 tháng 5 năm 2014 Giờ mùa đông Đông Âu

Mặt trời, 11 tháng 5 năm 2014 23:11:51 EEST

Hãy thay đổi chuỗi định dạng và bạn có thể nhận được kết quả mong muốn.

Các vấn đề liên quan