为什么Java 8 Instant.now()在本地服务器上显示错误的UTC?

时间:2018-12-01 11:25:04

标签: java time server utc java.time.instant

Java8 Instant.now()给出了已经用UTC格式化的当前时间。我在CompileJava.net上创建了一个简单的沙盒测试,以验证我的预期结果:

Timestamp createdDateUtc = Timestamp.from(Instant.now());
System.out.println(createdDateUtc);

LocalDateTime databaseUtcLocal = createdDateUtc.toLocalDateTime();
ZonedDateTime databaseUtcZoned = databaseUtcLocal.atZone(ZoneId.of("UTC"));
ZonedDateTime userTimezoneTime = databaseUtcZoned.withZoneSameInstant(ZoneId.of("Asia/Qatar")); 
System.out.println(userTimezoneTime.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a")));

注意:当前是世界标准时间2018年12月1日上午11:16。

当我在在线编译器上运行此代码时,我得到了输出:

2018-12-01 11:17:43.637
12/01/2018 02:17:43 PM

但是当我在本地JBOSS服务器上运行此代码时,却得到以下输出:

2018-12-01 03:18:07.464
12/01/2018 06:18:07 AM

这里可能出什么问题了?我的服务器UTC时钟不正确吗?我的本地服务器的物理位置在加利福尼亚。虽然没关系,但当我尝试使用Instant.now()显示UTC时间时,却获得了太平洋时间,这似乎很奇怪。

任何帮助,不胜感激!

更新

如已接受的答案所指出,问题是我的Timestamp.from()方法:

System.out.println(Instant.now());
System.out.println(Timestamp.from(Instant.now()));

输出:

2018-12-01T11:48:33.153Z
2018-12-01 03:48:33.171

所以现在我的问题已经改变。如果您有类似的问题,我在此堆栈溢出here中找到了答案。我使用的是这个丑陋的混乱,而不是Timestamp.from(Instant.now())

Timestamp.valueOf(ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime())

1 个答案:

答案 0 :(得分:2)

我认为Timestamp.toString()方法存在问题。如果您看里面,将会看到:

public String toString () {

    int year = super.getYear() + 1900;
    int month = super.getMonth() + 1;
    int day = super.getDate();
    int hour = super.getHours();
    int minute = super.getMinutes();
    int second = super.getSeconds();
    // other code
}

方法getHours()getMinutes()和其他方法来自Date类,并且根据文档,它们按本地时区Date.getHours()对其进行解释。