2011-12-22 28 views
6

Tôi nhận ParseException cho đoạn mã saujava.text.ParseException: ngày Unparseable: yyyy-MM-dd HH: mm: ss.SSSSSS

String dateStr = "2011-12-22 10:56:24.389362"; 
    String formatStr = "yyyy-MM-dd HH:mm:ss.SSSSSS"; 
    Date testDate = null; 
    SimpleDateFormat sdf= new SimpleDateFormat(formatStr); 
    sdf.setLenient(false); 
    testDate = sdf.parse(dateStr); 

    System.out.println("CHECK DATE " + sdf.format(testDate)); 

Exception in thread "main" java.text.ParseException: Unparseable date: "2011-12-22 10:56:24.389362" at java.text.DateFormat.parse(DateFormat.java:337)

Nếu tôi nhận xét ra dòng sdf.setLenient(false), sau đó tôi thấy sự khác biệt về thời gian trong ouput CHECK DATE 2011-12-22 11:02:53.000362

Tôi đang làm gì sai ??

Trả lời

7

'S' là trong mili giây. Có 1000 (0 đến 999) mili giây trong một giây. 389362 lớn hơn 999. Khoảng 389000 mili giây sẽ được chuyển đổi thành 389 giây hoặc 6 phút 29 giây và được thêm vào thời gian đó.

+0

Mô hình nào nên cho phép 389362? – Praneeth

+0

Mili giây là thời gian ngắn nhất được phép. Bạn cần phải thay đổi đầu vào để nó chỉ đi đến ba chữ số thập phân '389' trong ví dụ, và định dạng kết thúc bằng '.SSS' –

+0

Cảm ơn. Tôi cần phải thay đổi đầu vào của tôi thành ba chữ số thập phân hoặc tôi cần phải viết trình phân tích cú pháp của riêng mình cho phép số giây vi mô theo @GrailsGuy – Praneeth

3

Nhập ngày của bạn trong mili giây không chính xác. Nó nên là: -

String dateStr = "2011-12-22 10:56:24.389";

Bạn cũng không cần số lượng thêm "S" s trong mẫu. Sau đây là đủ:

String formatStr = "yyyy-MM-dd HH:mm:ss.S";

Nó được đề cập rõ trong java docs cho loại trình bày của Number:

Số: Đối với định dạng, số lượng chữ mô hình là tối thiểu số chữ số và các số ngắn hơn không được đệm vào số tiền này. Để phân tích cú pháp, số chữ hoa văn bị bỏ qua trừ khi đó là cần để tách hai trường liền kề.

Nó hoạt động khi bạn đặt mong muốn là đúng (hoặc nhận xét dòng mặc định là đúng) vì bạn yêu cầu trình phân tích cú pháp không nghiêm ngặt về phân tích cú pháp. Từ tài liệu java trên setLenient(): -

Chỉ định xem có phân tách ngày/giờ hay không. Với phân tích cú pháp khoan dung, trình phân tích cú pháp có thể sử dụng chẩn đoán để giải thích đầu vào không khớp chính xác với định dạng của đối tượng này. Với phân tích cú pháp nghiêm ngặt, các đầu vào phải khớp với định dạng của đối tượng này.

4

Trình định dạng định dạng S đề cập đến mili giây. Khi bạn cho phép phân tích cú pháp khoan dung, phần cuối cùng được hiểu là 389362 mili giây. Khi được thêm vào ngày cho đến nay, 3 chữ số cuối cùng (thực tế, giá trị% 1000) trở thành mili giây thực tế và bạn sẽ có một ngày khoảng 389 giây (~ 6 1/2 phút) sau khi bạn mong đợi . (Với phân tích cú pháp nghiêm ngặt, trình phân tích cú pháp biết rằng 389362 mili giây không có ý nghĩa, do đó, nó ném một lỗi.)

Cách đơn giản nhất là, nếu bạn có thể đảm bảo ngày sẽ luôn như thế, sẽ bị cắt 3 chữ số cuối cùng tắt. (Điều này sẽ khoảng một nửa thời gian cung cấp cho bạn một ngày đó là tắt bởi một phần nghìn giây. Nhưng đó là tốt hơn so với việc phải viết một phân tích ngày ...)

2

S chỉ được sử dụng cho milliseconds. Nếu bạn muốn micro giây, bạn sẽ phải viết trình phân tích cú pháp của riêng mình.

0

Sử dụng toISOString('HH:mm:ss.S') để có được mili giây (3 chữ số), sau đó hoàn tất khi bạn cần với 0.

Ví dụ:

new Date().toISOString('HH:mm:ss.S') 

lợi nhuận "2012-02-10T12: 16: 39.124Z"

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