Instant.now()返回错误的UTC时间(例如14:24而不是02:24)+12小时

时间:2018-03-08 03:01:56

标签: java android utc

所以我试图用Java获取当前的UTC时间(我使用带有ThreeTenAbp的Java 7)。我尝试了以下呼叫,并且所有这些呼叫都以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时间的方法都不太可能产生错误的结果,所以我想知道我做错了什么。

3 个答案:

答案 0 :(得分: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()给出您观察到的错误结果。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

当您打印Instant.now().toString()时,您确定结果不是UTC吗?因为Instant始终以UTC格式运行。

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

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

顺便说一下,当前的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,不会使输出不明确。