【问题标题】:Why UTC timezone giving ahead time for System.currentTimeMillis in Java?为什么 UTC 时区会提前为 Java 中的 System.currentTimeMillis 提供时间?
【发布时间】:2015-04-28 12:15:42
【问题描述】:

我从 Ruby on Rails 网络服务获取 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 是我从 web 服务获取的时间。 resTime 的值显示负值,大约为 6 分钟以上。

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

【问题讨论】:

  • 时区与问题有什么关系?您的代码不使用 utc_current,它只是将当前时间与硬编码的 long 值进行比较。我怀疑 6 分钟以上的时间是将 ruby​​ 打印的时间复制并粘贴到您的 Java 代码中、重新编译 Java 代码并运行它所花费的时间。您的代码可以简化为System.out.println("Time Diff : " + (System.currentTimeMillis() - 1424936268000L));

标签: java datetime time timezone


【解决方案1】:

与@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-object 上严格避免getCalendar() 方法。它仅用作内部格式和解析处理的中间可变对象。很难说随着时间的推移你会真正得到什么。而是直接使用System.currentTimeMillis() 来比较您的本地时间和服务器时间。

另一个问题是您使用的模式。 "dd-MM-yyyy hh:mm:ss" 可能不正确,因为它使用 1-12 范围内的半天时钟小时,但缺少上午/下午的信息。最好使用图案符号 HH。检查 webservice 的文档以获取正确的格式。

【讨论】:

    【解决方案2】:

    确保服务器和客户端计算机上的时钟同步。 6 分钟可能只是两者之间的偏移。

    【讨论】:

    • 是的,它们是同步的
    • 好的,那么。 Web 服务的代码是什么样的?完整的程序是什么?
    猜你喜欢
    • 2015-04-28
    • 2019-02-12
    • 1970-01-01
    • 2012-05-17
    • 2014-02-07
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多