从Java中的邮件Date标头中提取时区的最佳方法?
时间:2020-03-06 14:29:04 来源:igfitidea点击:
我需要存储从中发送电子邮件的时区。从电子邮件的"日期:"标头(RFC822日期)中提取它的最佳方法是什么?以及将其存储在数据库中的推荐格式是什么(我正在使用休眠)?
解决方案
使用某种子字符串或者正则表达式从标头中提取数据。使用SimpleDateFormatter解析日期以创建Date对象。
使用JodaTime可能最容易解析,因为它支持ISO8601,请参阅使用Joda Time在Java中进行日期和时间解析和格式化。
DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis(); System.out.println(parser2.parseDateTime(your_date_string));
时间必须始终与时区一起存储在UTC(GMT)中,即在解析后从时区转换为GMT并删除夏令时偏移量并保存原始时区之后。
转换为UTC后,必须将日期和时区一起存储。
如果删除或者不处理时区,则在处理来自其他时区的数据时会引起问题。
电子邮件中的时区将不会显示其发送的时区。有些程序使用UTC或者GMT。当然,时区是日期时间值的一部分,还必须进行解析。
你为什么想知道。
我们要标准化时间戳吗?然后使用DateFormat对其进行解析。
我们是否要检测发送电子邮件的用户的时区?这将无法正常工作。
看来我们已经在评论中提到了这一点,但我认为这是最佳答案。 JavaMail库在javax.mail.internet.MailDateFormat
中包含RFC822 Date标头解析代码。不幸的是,它没有直接公开TimeZone解析,因此我们将需要直接从javax.mail.internet.MailDateParser
复制必要的代码,但是值得利用已经完成的精心工作。
至于存储它,解析器将为我们提供日期作为偏移量,因此我们应该可以将其存储为int
(让Hibernate为我们将其转换为数据库)就可以了。