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

Java Instant.now()返回错误的UTC时间(例如14:24而不是02:24)+;提前12小时,java,android,utc,Java,Android,Utc,因此,我尝试用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 Simpl

因此,我尝试用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时间的所有这些方法不太可能产生错误的结果,因此我想知道我做错了什么。

我测试了您的代码,发现您的代码正常。请重试,或者您可以尝试以下代码:

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

打印
Instant.now().toString()
时,是否确定结果不是UTC格式?因为
Instant
始终在UTC中工作

我唯一能猜到的是,您正在直接打印
java.util.Date
,这个类有一个可怕的
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
可以获得以AM/PM(1到12)为单位的小时数,而不是0到23(这是默认值,也是
hh
模式返回的值)。我还添加了
a
,它为您提供AM或PM,以避免输出不明确。

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

你可能会反对并问:我如何将系统时钟设置为提前12小时?我怎么会不知道呢?对此可能有很多解释,但有两个显而易见的解释:

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

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