Linux服务器显示UTC而不是EST,本地显示EST

时间:2015-12-02 15:21:25

标签: java linux calendar timezone

我无法弄清楚为什么以下代码的时区会一直显示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());
    }

2 个答案:

答案 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.time

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);
}

ONLINE DEMO

注意: 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 desugaringHow to use ThreeTenABP in Android Project

相关问题