我需要存储发送电子邮件的时区。从电子邮件的“日期:”标题(RFC822日期)中提取它的最佳方法是哪种?什么是将其存储在数据库中的推荐格式(我正在使用hibernate)?
答案 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),因为它不考虑夏令时。