我无法弄清楚为什么以下代码的时区会一直显示UTC而不是EST。在我的本地计算机上它显示EST,即使我在MST时间但在实际服务器上它仍然显示UTC。任何线索?
Mon Nov 9 2015 1:58:49 PM UTC
@JsonIgnore
public String getDateCreatedFormatted() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(getDateCreated());
calendar.setTimeZone(TimeZone.getTimeZone("EST"));
SimpleDateFormat format = new SimpleDateFormat("EEE MMM d yyyy h:mm:ss a z");
return format.format(calendar.getTime());
}
答案 0 :(得分:16)
您已将日历设置为EST,但您尚未在SimpleDateFormat
上设置时区,这是用于格式化的时区。只需使用:
format.setTimeZone(TimeZone.getTimeZone("America/New_York"));
格式化Date
之前的。根据它的外观,你根本不需要Calendar
:
@JsonIgnore
public String getDateCreatedFormatted() {
SimpleDateFormat format = new SimpleDateFormat("EEE MMM d yyyy h:mm:ss a z", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("America/New_York"));
return format.format(getDateCreated());
}
此外,我强烈建议您使用上述全时区ID,而不是像" EST"这样的缩写。这是模棱两可的。 (有两个问题 - 首先,EST在不同的位置可能意味着不同的东西;其次,美国EST应该始终意味着东方标准时间,而我假设你想要使用东方时间格式,要么是标准或日光取决于夏令时是否有效。)
答案 1 :(得分:0)
java.util
日期时间 API 及其格式化 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*。
使用 java.time
(现代日期时间 API)的解决方案:
@JsonIgnore
public String getDateCreatedFormatted() {
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/New_York"));
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM d uuuu h:mm:ss a z", Locale.ENGLISH);
return dtf.format(now);
}
注意: Never use SimpleDateFormat or DateTimeFormatter without a Locale。
从 Trail: Date Time 了解有关现代 Date-Time API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。