2010-03-16 47 views
14

Tôi cần phải phân tích cú pháp biểu diễn chuỗi RFC 2822 của một ngày trong Java. Một chuỗi ví dụ là ở đây:Phân tích cú pháp ngày RFC 2822 trong JAVA

Sat, 13 Mar 2010 11:29:05 -0800

Nó trông khá khó chịu vì vậy tôi muốn chắc chắn rằng tôi đang làm tất cả những gì đúng đắn và sẽ chạy vào lạ vấn đề sau đó với ngày được giải thích sai hoặc thông qua AM-PM/vấn đề thời gian quân sự, vấn đề thời gian UTC, vấn đề tôi không dự đoán, vv ...

Cảm ơn!

+3

Bạn đã thử sử dụng 'java.text.SimpleDateFormat' chưa? – skaffman

+0

Điều đó giống như một trong những quyền sử dụng, tôi đã lo lắng về những gì các chuỗi định dạng chính xác là tốt, nó trông giống như một cái gì đó mà có thể dễ dàng để mess up. Điều này dường như là chuỗi bên phải cho RFC 2822 mặc dù: "EEE, d MMM yyyy HH: mm: ss Z" (theo câu trả lời dưới đây) –

+1

không phải là 'd' nhưng' dd'. –

Trả lời

19

Đây là mã nhanh chóng mà không gì bạn yêu cầu (sử dụng SimpleDateFormat)

String rfcDate = "Sat, 13 Mar 2010 11:29:05 -0800"; 
String pattern = "EEE, dd MMM yyyy HH:mm:ss Z"; 
SimpleDateFormat format = new SimpleDateFormat(pattern); 
Date javaDate = format.parse(rfcDate); 

//Done. 

PS. Tôi đã không xử lý các trường hợp ngoại lệ và đồng thời ở đây (vì SimpleDateFormat không được đồng bộ hóa khi phân tích ngày).

+0

sử dụng liên kết này http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html cho các giá trị được chấp nhận mới nhất – rajadilipkolli

19

Nếu ứng dụng của bạn đang sử dụng một ngôn ngữ khác ngoài tiếng Anh, bạn có thể muốn để buộc các miền địa phương cho ngày phân tích cú pháp/định dạng bằng cách sử dụng một constructor SimpleDateFormat thay thế:

String pattern = "EEE, dd MMM yyyy HH:mm:ss Z"; 
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.ENGLISH); 
+4

Đặt Locale là bắt buộc. Android javadoc cho Locale gợi ý sử dụng Locale.US cho giao tiếp giữa các máy tính với máy tính. [link] (https://developer.android.com/reference/java/util/Locale.html) –

+0

+1 Locale.ROOT cũng sẽ là một lựa chọn tốt, nhưng không có sẵn trên tất cả các hệ thống. – Jules

+0

@jasongilbert Bạn có thể giải thích lý do tại sao bạn nói rằng Locale "chắc chắn là bắt buộc"? Theo tài liệu, nó không phải là: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html - nhưng có thể bạn có nghĩa là "bắt buộc nếu ..." và đó là sự tiếp tục của "if" mà tôi quan tâm ... –

4

Hãy ghi nhớ rằng [Day- trong tuần ","] là tùy chọn trong RFC-2822, do đó các ví dụ được đề xuất không bao gồm tất cả các định dạng ngày RFC-2822. Ngoài ra, loại ngày tháng RFC-822 cho phép nhiều ký hiệu múi giờ khác nhau (vùng bị ám ảnh), không được trình bày theo định dạng "Z".

Tôi đoán không có cách nào dễ dàng, ngoài việc tìm kiếm "," và "- | +" để xác định mẫu sẽ sử dụng.

+1

+1 để chỉ ra rằng ngày trong tuần là tùy chọn. Tôi đang thiết lập một thác nước của try/catches với các mẫu khác nhau để chỉ tiếp tục thử các biến thể cho đến khi nó tìm thấy một trong đó hoạt động. –

+0

không chỉ 'ngày trong tuần 'là tùy chọn, còn các giây trong thời gian trong ngày được khai báo là tùy chọn:' time-of-day = hour ":" minute [":" second] ' –

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