gpt4 book ai didi

java - 为什么 UTC 时区提前了 Java 中的 System.currentTimeMillis 时间?

转载 作者:行者123 更新时间:2023-12-01 22:26:16 24 4
gpt4 key购买 nike

我从 Ruby on Rails Web 服务获取 Unix 时间戳格式的当前时间(即从 1970 年 1 月 1 日开始的秒数),服务器上的时区是 UTC

在Java中,我试图将本地当前时间转换为UTC时间。但每次都会提前6分钟。我想获得 UTC 当前时间和从服务返回的时间之间的差异。我的 Java 代码是 -

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
Date utc_current = new Date(System.currentTimeMillis());
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
long serverTime = 1424936268000L;
long resTime = sdf.getCalendar().getTimeInMillis() - serverTime;
System.out.println("Time Diff : " + resTime);

其中serverTime是我从网络服务获取的时间。 resTime 的值显示负值,大约 6 分钟以上。

所以我的问题是为什么 UTC 时区提前为 System.currentTimeMillis 提供时间?

最佳答案

与 @JB Nizet 注释中的假设相反,表达式 sdf.getCalendar().getTimeInMillis()System.currentTimeMillis() 并不等效。证明:

SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
System.out.println("date via System.currentTimeMillis()=" + f.format(utc_current));
System.out.println("date via sdf.getCalendar()=" + f.format(new Date(resTime)));

输出:

date via System.currentTimeMillis()=2015-02-26T12:19:09
date via sdf.getCalendar()=1889-12-31T04:41:21

如果你仔细研究SimpleDateFormatDateFormat的源代码,你会发现初始化部分代码如下:

private void initializeDefaultCentury() {
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add( Calendar.YEAR, -80 );
parseAmbiguousDatesAsAfter(calendar.getTime());
}

结论是严格避免在 DateFormat 对象上使用 getCalendar() 方法。它仅用作内部格式和解析处理的中间可变对象。很难说随着时间的推移你会真正得到什么。而是直接使用 System.currentTimeMillis() 将本地时间与服务器时间进行比较。

另一个问题是您使用的模式。 “dd-MM-yyyy hh:mm:ss”可能不正确,因为它使用 1-12 范围内的半天时钟时间,但缺少 am/pm 的信息。更好地使用图案符号 HH。检查 Web 服务的文档以获取正确的格式。

关于java - 为什么 UTC 时区提前了 Java 中的 System.currentTimeMillis 时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28737046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com