我想使用Java将时区(如PST或PDT)的邮件头中可用的日期转换为UTC格式。
例如:
Tue,21 Apr 2015 07:12:18 -0700(PDT)。这是将在字符串变量中的日期。我想将此日期转换为UTC格式。此日期不是当前系统日期。请向我建议使用Java解决该问题的方法。
假设您正在使用MimeMessage getSentDate或getReceivedDate方法,您将获得一个已经正确转换的Date对象。您只需要格式化并显示所需的日期,例如,使用SimpleDateFormat。
对于该转换,您将需要一个良好的时间库,其中要考虑夏时制等。对于Java,一个很棒的库是Joda。该库允许输入和输出使用多种格式选项来解决您的问题。请参阅文档中的样本。
您的示例数据很奇怪。我记得旧的电子邮件标准使用RFC 1123或RFC 822。您的格式类似,但是在偏移的小时和分钟之间缺少冒号,并且在伪区域周围有多余的括号。
请注意,此类格式已过时。它们很难用机器解析。他们假设英语和特定的文化规范。现代协议改为采用ISO 8601格式。默认情况下,java.time类中使用ISO 8601格式。
如果您确实必须解析该特定格式的文本,请定义一个DateTimeFormatter
以匹配其格式设置。
String input = "Tue, 21 Apr 2015 07:12:18 -0700 (PDT)";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss XXXX '('z')'" ).withLocale( Locale.US );
解析为ZonedDateTime
。
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
zdt.toString():2015-04-21T07:12:18-07:00 [America / Los_Angeles]
请注意,PDT
不是实时区域名称。切勿使用这些2-4个字母的伪区域。 Real time zones具有Continent/Region
格式的名称,例如America/Los_Angeles
。