为什么 Java 8 Instant.now() 在我的本地服务器上显示错误的 UTC?
Why is Java 8 Instant.now() showing the wrong UTC on my local server?
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")));
注意:目前是 11:16 UTC 时间 12/01/2018。
当我在在线编译器上 运行 这段代码时,我得到输出:
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
所以现在我的问题变了。如果你有类似的问题,我在这个 Stack Overflow 上找到了答案。而不是 Timestamp.from(Instant.now())
我使用了这个丑陋的混乱:
Timestamp.valueOf(ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime())
我认为 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
class 并且根据文档,它们按本地时区 Date.getHours().[=16 解释=]
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")));
注意:目前是 11:16 UTC 时间 12/01/2018。
当我在在线编译器上 运行 这段代码时,我得到输出:
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
所以现在我的问题变了。如果你有类似的问题,我在这个 Stack Overflow Timestamp.from(Instant.now())
我使用了这个丑陋的混乱:
Timestamp.valueOf(ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime())
我认为 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
class 并且根据文档,它们按本地时区 Date.getHours().[=16 解释=]