【问题标题】:Java get UTC timeJava获取UTC时间
【发布时间】:2016-04-01 18:50:07
【问题描述】:

我想获取 UTC 时区的时间。于是我写了代码:

import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Date;

public class RegularSandbox {

    public static void main(String[] args) {

        ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC);

        System.out.println("DATETIME = " + Date.from(utc.toInstant()));

    }
}

问题是输出显示了 PST(我的本地时区)的时间。我需要它以 UTC 格式输出时间,以便将其存储在我的数据库中。

【问题讨论】:

  • 这是格式化程序。您需要自己格式化,不要让toString 方法为您完成!
  • @BoristheSpider 感谢您的回复。抱歉,我不知道该怎么做?
  • the top 开始,一路向下...
  • 它是Date#toString()方法,它使用系统时区(操作系统正在使用),当它显示时,而不是Date本身。默认情况下,它始终采用UTC。所以,如果你将一个Date 实例持久化到底层数据库,它应该根据UTC。这些答案仅说明如何在 Java 控制台上显示日期时间,例如,没有考虑到您需要将 Date 实例持久保存到数据库中(目前不支持 Java 8 DataTime )。
  • Format Instant to String的可能重复

标签: java datetime java-8


【解决方案1】:
System.out.println("DATETIME = " + utc.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

【讨论】:

  • 您可以在模式中添加 zone-id 或您需要的任何其他内容
  • 错误模式(使用“h”而不是“H”),因此错误的答案不幸被接受,没有仔细检查产生的结果是否正确。此外,任何亚秒部分都被抑制 - 为什么?
  • @Meno Hochschild。 DateTimeFormatter.ofPattern 是答案被接受的原因。这是 Topicstarter 一直在寻找的功能。感谢您的评论。我已经编辑了小时格式。
  • 幸运的是,从不不幸的事情中制造不幸的事情并不难。只要有一点宽容和创造性。一切都会好起来的。
【解决方案2】:

在尝试转换为旧的 java.util.Date 时,您做的太多了。然后你隐含地使用它的方法toString(),它应该以观察到的行为而闻名,总是在你的系统时区打印瞬间。

但是在 UTC 时区打印非常简单,如果您可以处理 ISO-8601 表示法,甚至不需要格式化程序:

ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC);

System.out.println("DATETIME = " + utc.toInstant());
// output: DATETIME = 2015-12-30T15:01:18.483Z (Instant is always printed with UTC offset)

System.out.println("DATETIME = " + utc);
// output: DATETIME = 2015-12-30T15:01:57.611Z (the same because you 
// have explicitly set the UTC Offset when constructing the ZonedDateTime)

你看,新的 Java-8 类 InstantZonedDateTimetoString() 的行为更加清晰,并且始终采用 ISO 格式。无需混淆转换为Date

关于专用格式化程序,如果您打算偏离 ISO-8601 格式,则只需要一个 - 可能使用本地化月份名称或额外打印工作日等。美式示例:

System.out.println(
  "DATETIME = " 
  + utc.format(DateTimeFormatter.ofPattern("MM/dd/uuuu h:mm:ss a xxx")));
// output: DATETIME = 12/30/2015 3:14:50 PM +00:00

请注意@LowLevel 的答案使用了错误的模式。如果省略符号 a(AM/PM 标记),则不应选择半天小时符号 h,而应选择 H(24 小时格式)。时区或偏移符号(此处为 x)至关重要,否则打印的日期时间将不会被自动识别为 UTC 时区。

【讨论】:

    【解决方案3】:
    ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC);
    final SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d, yyyy hh:mm:ss a z"); // you can specify format that you want to get
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println("UTC time: " + sdf.format(utc));
    

    【讨论】:

      【解决方案4】:
              private Calendar getUTCTime(){
                  Calendar calendar = Calendar.getInstance();
                  // Assuming your time is in utc + 8
                  calendar.add(Calendar.HOUR, -8);
                  return calendar;
              }
      

      【讨论】:

      • 问题说 UTC,并且所需的输出是字符串
      • 感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 其教育价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。
      【解决方案5】:

      我建议你使用Joda-Time

      DateTime dt = new DateTime(DateTimeZone.UTC);
      

      【讨论】:

      • OP 显然使用的是 Java 8,当新的 Data/Time API 完全能够格式化日期时,为什么你会推荐使用 Joda Time。
      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 2019-08-25
      • 2020-12-26
      • 2015-01-08
      • 2014-03-31
      • 2018-07-02
      • 2011-12-24
      • 2012-01-29
      相关资源
      最近更新 更多