【问题标题】:Instant.now() returns wrong UTC time ( E.g. 14:24 instead of 02:24 ) +12 hours aheadInstant.now() 提前 +12 小时返回错误的 UTC 时间(例如 14:24 而不是 02:24)
【发布时间】:2018-03-08 03:01:55
【问题描述】:

所以我试图在 Java 中获取当前的 UTC 时间(我正在使用 Java 7 和 ThreeTenAbp)。我尝试了以下调用,它们都返回 UTC + 12 小时的时间,这不是真正的 UTC 时间,因为我通过提供当前 UTC 时间的各种来源在线检查。

Instant.now().atZone(ZoneId.of("UTC")).toString();
Instant.now().toString();

Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

我不知道为什么这些报告错误的 UTC 时间,因为我明确指定了 UTC 时区,但第二个时区除外。我还认为所有这些获取 UTC 时间的方法不太可能产生错误的结果,所以我想知道我做错了什么。

【问题讨论】:

  • 我想知道为什么有人降级了这个问题?这将比仅仅给它一个-1更具建设性,就好像这个问题显然存在问题,人们需要知道在将来纠正它。
  • 我无法复制。从您的代码中,我得到了2018-03-09T17:45:49.066Z[UTC]2018-03-09T17:45:49.108Z09-03-2018 17:45:49。这个时间在运行时是正确的。我正在使用 ThreeTen Backport(但不是 ThreeTenABP)。很可能您的设备时间设置不正确。所有调用都使用设备的当前时间。

标签: java android utc


【解决方案1】:

当然,虽然我不能确定,但​​您观察到的行为很可能的原因是您在计算机或时钟设置不正确的设备上运行程序。 Instant.now()new Date() 都从系统时钟中获取时间,所以这很好解释。

您可能会反对并问:我如何将系统时钟设置为提前 12 小时?我怎么会不发现?虽然对此可能有很多解释,但最明显的两个是:

  • 将系统时钟设置错误 12 小时并不难,很容易发生错误。如果您的系统以 12 小时时钟(数字或模拟)显示时间,即使时间已提前 12 小时设置,它也会显示正确的时间。不过,您会注意到每天中午 12 点之后的日期提前一天。
  • 您的设备可能有错误的时区设置,因此当您将时间设置为您所在时区的正确时间时,这实际上意味着将其设置为时间线上的错误时间。例如:您的设备时区设置为 America/Los_Angeles,这几天仍然是 UTC-8。您在迪拜,当前时间为 UTC+4。在迪拜的上午 10 点,您将设备时间设置为 10:00,但您的设备将其理解为洛杉矶时间 10:00,相当于迪拜时间 22:00(晚上 10 点)。因此,通过这种方式,您的时钟意外地提前了 12 小时。而且只要没有人更正时区设置,就很难发现有什么问题。仍然会导致Instant.now()new Date() 给出您观察到的错误结果。

【讨论】:

    【解决方案2】:

    我测试了你的代码,发现你的代码没问题。再试一次,或者你可以试试下面的代码:

     Instant.now().atOffset(ZoneOffset.ofHours(0));
    

    【讨论】:

      【解决方案3】:

      当您打印 Instant.now().toString() 时,您确定结果不是 UTC 吗?因为Instant 总是在 UTC 中工作。

      我唯一能猜到的是你直接打印java.util.Date,而这个类有一个糟糕的toString() 方法takes the JVM default timezone

      也许如果您编辑您的问题并为每个案例添加输入和输出,我们可以为您提供更好的帮助。因为我无法重现您的问题。

      顺便说一句,当前的 UTC 时间是(当我测试代码时)2018-03-08T14:47:08.886Z(14:47 或 02:27 PM)。如果您的问题是以 AM/PM 格式打印时间,那么您可以使用 DateTimeFormatter:

      DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'hh:mm:ssaX");
      String formatted = ZonedDateTime.now(ZoneOffset.UTC).format(fmt);
      

      使用hh 为您提供上午/下午的小时(1 到 12),而不是 0 到 23(这是默认值,也是 HH 模式返回的值)。我还添加了a,它为您提供 AM 或 PM,以免输出模棱两可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-12
        相关资源
        最近更新 更多