从Java中的邮件日期标题中提取时区的最佳方法?

时间:2008-09-20 13:51:28

标签: java timezone javamail

我需要存储发送电子邮件的时区。从电子邮件的“日期:”标题(RFC822日期)中提取它的最佳方法是哪种?什么是将其存储在数据库中的推荐格式(我正在使用hibernate)?

5 个答案:

答案 0 :(得分:1)

可能最容易解析JodaTime,因为它支持ISO8601,请参阅Date and Time Parsing and Formatting in Java with Joda Time

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

时间必须始终以UTC(GMT)存储时区 - 即解析从时区转换为GMT并删除夏令时偏移并保存原始时区。

转换为UTC后,您必须将日期与时区一起存储。

如果删除或不处理时区,则在处理来自不同时区的数据时会出现问题。

答案 1 :(得分:0)

使用某种子字符串或正则表达式从标头中提取数据。使用SimpleDateFormatter解析日期以创建Date对象。

答案 2 :(得分:0)

电子邮件中的时区不会显示发送的时区。有些程序使用UTC或GMT。当然,时区是日期时间值的一部分,也必须解析。

你为什么要知道它。    - 你想要标准化时间戳吗?然后使用DateFormat进行解析。    - 您想检测发送电子邮件的用户的时间表吗?这将无法正常工作。

答案 3 :(得分:0)

看起来你已经在你的一条评论中提到了这一点,但我认为这是你最好的答案。 JavaMail库包含javax.mail.internet.MailDateFormat中的RFC822 Date头解析代码。不幸的是,它没有直接暴露TimeZone解析,因此您需要直接从javax.mail.internet.MailDateParser复制必要的代码,但是值得利用已经完成的仔细工作。

至于存储它,解析器会给你一个偏移量的日期,所以你应该可以将它存储为int(让Hibernate将它转换为你的数据库)。

答案 4 :(得分:0)

我建议您使用Mime4J

该库旨在解析各种电子邮件垃圾。 对于解析日期,您将使用其DateTimeParser

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

之后我通常会将日期时间转换为 Joda's DateTime 。不要使用SimpleDateFormatter,因为它不会涵盖RFC822的所有情况。

下面将为您提供 Joda TimeZone (来自上面的int区域),它优于Java的TZ。

// 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);

现在唯一的问题是时区你将永远是一个数字时区,可能仍然不是用户发送电子邮件的正确时区(假设邮件应用程序发送给用户TZ而不仅仅是UTC)

例如-0400不是EDT(即America / New_York),因为它不考虑夏令时。

相关问题