【问题标题】:Linux server showing UTC instead of EST, local showing ESTLinux 服务器显示 UTC 而不是 EST,本地显示 EST
【发布时间】:2016-03-06 21:49:06
【问题描述】:

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

【问题讨论】:

    标签: java linux calendar timezone


    【解决方案1】:

    java.time

    java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

    使用现代日期时间 API java.time 的解决方案:

    @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 了解有关现代日期时间 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

    【讨论】:

      【解决方案2】:

      您已将 日历 设置为 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 应该始终表示东部 标准 时间,而我假设您想使用东部时间进行格式化,无论是标准时间或日光,具体取决于夏令时是否有效。)

      【讨论】:

      • 我确实有 America/New_York,只是切换它看看是不是它。会试试你说的。
      • 那行得通,知道为什么有人说 EST 而有人说 EDT 吗?
      • @MikeFlynn:嗯,大概标准时间(即冬天)的那些说 EST,而夏令时(即夏天)的那些说 EDT...
      • @MikeFlynn:是的,你可以传入一个固定的时区,然后将格式更改为最后使用'EST'。但我会非常强烈敦促您不要这样做。我知道 很多 人对此感到非常困惑,以为“EST”仅表示“东部时间”(即有时真的是 EDT)。如果您向两个不同的人展示“2016 年 3 月 19 日星期六 10:00:00 AM EST”,他们可能会有不同的解释——如果他们打算在那时见面,其中一个人可能会比另一个人早一个小时到达。这肯定不是一件好事。
      • @MikeFlynn:如果“它需要以某种方式说 EST”的原因是因为它在需求文档中,我会反驳并解释为什么这是一个坏主意。如果这是我,那么必须有一个非常非常非常很好的理由来引入如此大的混淆可能性。
      猜你喜欢
      • 2014-05-18
      • 1970-01-01
      • 2018-09-07
      • 2022-10-12
      • 2019-09-25
      • 1970-01-01
      • 2016-07-16
      • 2020-12-01
      • 2018-02-14
      相关资源
      最近更新 更多