所以我试图用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时间的方法都不太可能产生错误的结果,所以我想知道我做错了什么。
答案 0 :(得分:1)
虽然我无法确定,当然,您观察到的行为的可能原因是您在计算机或设备上运行程序,其时钟设置不正确。 Instant.now()
和new Date()
都会从系统时钟中获取时间,因此可以很好地解释。
您可以反对并询问:我如何提前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,不会使输出不明确。