2008-09-20 38 views

Trả lời

0

Trích xuất dữ liệu từ tiêu đề bằng cách sử dụng một số loại chuỗi con hoặc cụm từ thông dụng. Phân tích cú pháp ngày tháng bằng một SimpleDateFormatter để tạo một đối tượng Date.

+0

Cảm ơn jhawk28. Tuy nhiên tôi có thể nhận được ngày bằng cách sử dụng lớp MailDateFormat. Lớp đó cũng phân tích múi giờ, nhưng dường như không có cách nào dễ dàng để tìm thấy TimeZone đó, ngoại trừ việc sao chép mã từ MailDateParser. – mmartijn

1

Có lẽ dễ nhất để phân tích cú pháp với JodaTime vì nó hỗ trợ ISO8601, xem Date and Time Parsing and Formatting in Java with Joda Time.

DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis(); 
System.out.println(parser2.parseDateTime(your_date_string)); 

Thời gian phải luôn luôn được lưu trữ trong UTC (GMT) với một múi giờ - nghĩa là sau khi phân tích cú pháp chuyển đổi từ múi giờ lấy múi giờ GMT và loại bỏ tiết kiệm ánh sáng ban ngày bù đắp và lưu các múi giờ gốc.

Bạn phải lưu trữ ngày có múi giờ sau khi chuyển sang UTC.

Nếu bạn xóa hoặc không xử lý múi giờ, nó sẽ gây ra sự cố khi xử lý dữ liệu đến từ múi giờ khác.

+0

** Sai! ** Tốt hơn rất nhiều để lưu trữ DateTime * với * múi giờ miễn là nó đúng và bạn sử dụng thư viện datetime hiện đại như Joda. Đó là xử lý TimeZone. Bằng cách vứt bỏ múi giờ và bình thường hóa cho UTC, dữ liệu mất dữ liệu của bạn có thể có giá trị đối với người dùng, đặc biệt nếu nó là một ứng dụng di động/toàn cầu. ** Ngoài ra SimpleDateFormat không phải là threadafe! ** ... Tôi bị cám dỗ -1 bạn. –

+0

@AdamGent Đó là ý của tôi "nếu bạn xóa hoặc không xử lý múi giờ, nó có thể gây ra sự cố ....". Tôi sẽ chỉnh sửa để làm cho tinh thể này rõ ràng. –

+0

Vui lòng xóa bài đăng trên blog quá hoặc atl east lưu ý nguy cơ đồng thời nghiêm trọng khi tạo một mảng tĩnh công khai của simpledateformat. –

0

Múi giờ trong email sẽ không hiển thị theo múi giờ nào được gửi. Một số chương trình sử dụng UTC hoặc GMT. Tất nhiên múi giờ là một phần của giá trị ngày tháng và cũng phải phân tích cú pháp.

Tại sao bạn muốn biết điều đó. - Bạn có muốn bình thường hóa dấu thời gian không? Sau đó, sử dụng DateFormat để phân tích nó. - Bạn có muốn phát hiện timezome của người dùng gửi email không? Điều này sẽ không hoạt động chính xác.

+0

Tôi muốn phát hiện múi giờ của người dùng đã gửi email. Tại sao nó không hoạt động? – mmartijn

+0

Bởi vì một số chương trình gửi UTC hoặc giờ GMT không phụ thuộc vào múi giờ của người dùng. Đây là múi giờ của chuỗi ngày tháng được định dạng và không phải của máy tính người dùng. – Horcrux7

0

Dường như bạn đã đề cập đến điều này trong một trong các nhận xét của bạn, nhưng tôi nghĩ đó là câu trả lời hay nhất của bạn. Thư viện JavaMail chứa mã phân tích cú pháp tiêu đề ngày RFC822 trong javax.mail.internet.MailDateFormat. Thật không may nó không phơi bày việc phân tích TimeZone trực tiếp, vì vậy bạn sẽ cần phải sao chép mã cần thiết trực tiếp từ javax.mail.internet.MailDateParser, nhưng nó có giá trị lợi dụng công việc cẩn thận đã được thực hiện.

Để lưu trữ, trình phân tích cú pháp sẽ cung cấp cho bạn ngày tháng là một khoản bù trừ, vì vậy bạn có thể lưu trữ nó chỉ là int (cho phép Hibernate dịch cơ sở dữ liệu của bạn cho bạn).

+0

Anh ta có thể sử dụng trình phân tích cú pháp Mime4J DateTime thay vì MailDateParser có phạm vi thân thiện (mỉa mai). Xem câu trả lời của tôi. –

0

Tôi khuyên bạn nên sử dụng Mime4J.

Thư viện được thiết kế để phân tích cú pháp tất cả các loại email crap. Để phân tích ngày bạn sẽ sử dụng DateTimeParser.

int zone = new DateTimeParser(new StringReader("Fri, 27 Jul 2012 09:13:15 -0400")).zone(); 

Sau đó tôi thường chuyển đổi datetimes để Joda's DateTime. Không sử dụng SimpleDateFormatter như sẽ không bao gồm tất cả các trường hợp cho RFC822.

Dưới đây sẽ cho bạn Joda TimeZone (từ vùng int ở trên) vượt trội hơn TZ của Java.

// Stupid hack in case the zone is not in [-+]zzzz format 
final int hours; 
final int minutes; 
if (zone > 24 || zone < -24) { 
    hours = zone/100; 
    minutes = minutes = Math.abs(zone % 100); 
} 
else { 
    hours = zone; 
    minutes = 0; 
} 
DateTimeZone.forOffsetHoursMinutes(hours, minutes); 

Bây giờ vấn đề duy nhất là múi giờ bạn sẽ nhận được luôn là một múi giờ số đó có thể vẫn không có múi giờ đúng của người sử dụng gửi email (giả sử các ứng dụng mail gửi cho người sử dụng TZ và không chỉ UTC).

Ví dụ: -0400 không phải là EDT (nghĩa là America/New_York) vì nó không tính đến khoản tiết kiệm Ánh sáng ban ngày.

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