【问题标题】:format as GMT/UTC time when default timezone is something else当默认时区为其他时,格式为 GMT/UTC 时间
【发布时间】:2011-01-06 13:37:57
【问题描述】:

由于其他原因,我有一个程序需要在我的本地时区下运行,但对于一个过程,我需要在 GMT 中使用 SimpleDateFormat 输出日期。

最整洁的方法是什么?

【问题讨论】:

    标签: java date timezone


    【解决方案1】:

    使用standard API

    Instant now = Instant.now();
    String result = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
                                     .withZone(ZoneId.of("GMT"))
                                     .format(now);
    System.out.println(result);
    

    新的DateTimeFormatter 实例是不可变的,可以用作静态变量。

    使用旧的标准 API:

    TimeZone gmt = TimeZone.getTimeZone("GMT");
    DateFormat formatter = DateFormat.getTimeInstance(DateFormat.LONG);
    formatter.setTimeZone(gmt);
    System.out.println(formatter.format(new Date()));
    

    【讨论】:

      【解决方案2】:

      鉴于SimpleDateFormat 不是线程安全的,我想说最简洁的方法是改用Joda Time。然后你可以创建一个格式化程序(调用withZone(DateTimeZones.UTC) 来指定你想要UTC)然后你就离开了:

      private static DateTimeFormatter formatter = DateTimeFormat.forPattern(...)
          .withZone(DateTimeZone.UTC);
      
      ...
      
      String result = formatter.print(instant);
      

      这还有一个好处,就是您可以在代码的其他地方使用 Joda Time,这总是是件好事 :)

      【讨论】:

      • @John Skeet 在这种情况下线程安全的相关性有多大?我有毫秒的时间,我需要将其转换为具有特定格式的 UTC 字符串。麦克道尔的答案不正确吗?
      • @Zainodis:如果您每次都乐于创建一个新的DateFormat,那很好。不过,我个人更喜欢 Joda Time 方法 - 哎呀,部分原因是 Joda Time 只是一个更好的 API。
      • @JonSkeet 非常感谢您的回复。我完全同意,Java 日期/时间/日历 API 是一个巨大的痛苦。但是,因为在我的情况下,我正在开发 android 应用程序,所以我宁愿只使用我不能没有的库来缩小它们的大小。 JodaTime 会比处理那些 Java 时间问题要好得多,但它不足以证明添加另一个库是合理的:)。
      猜你喜欢
      • 2011-03-28
      • 2020-08-31
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2014-05-11
      相关资源
      最近更新 更多