【发布时间】:2018-09-24 22:24:42
【问题描述】:
我遵循了代码(简化为专注于问题)。使用SimpleDateFormat 模式打印时区信息。
你知道为什么 z 在不同机器上的处理方式不同吗?如果有办法告诉 Java 在所有机器上统一处理它?
该类在JavaMail 中使用,这导致我们的电子邮件标题包含不符合RFC 2822 的时间。
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class DateFormatTest {
String PATTERN = "z";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(this.PATTERN);
public static void main(final String[] args) {
new DateFormatTest().printTimezone();
}
public void printTimezone() {
System.out.println(this.simpleDateFormat.format(Calendar.getInstance().getTime()));
}
}
输出:Windows / Mac
PDT
输出:Linux(CentOS Linux 版本 7.5.1804(核心))/Ubuntu 14 / 18
GMT-07:00
【问题讨论】:
-
您能指定违反了哪个 RFC(和部分)吗?
-
RFC2822 并且有问题的格式字符串是
EEE, d MMM yyyy HH:mm:ss Z (z)java 邮件使用的。在 Linux 上,此格式字符串生成Sat, 22 Sep 2018 22:20:17 -0700 (GMT-07:00),但在 mac 上为Sat, 22 Sep 2018 22:17:44 -0700 (PDT)(缺少时区偏移) -
@Gopinath
RFC 2822 - Internet Message Format - IETF Datatracker???可能是 RFC 822,它是大写的Z,而不是小写的z -
它的 RFC2822 记录在 Java Mail API javaee.github.io/javaee-spec/javadocs/javax/mail/internet/… 上。无论如何,令人费解的问题是什么会影响格式字符串的小写
z的输出?z之外的某些环境具有带偏移量的时区,而其他环境仅具有时区。 -
仅供参考,非常麻烦的旧日期时间类,如
java.util.Date、java.util.Calendar和java.text.SimpleDateFormat现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。
标签: java date datetime jakarta-mail simpledateformat