当前位置: 首页 > 知识库问答 >
问题:

为什么UTC时区提前System.currentTimeMillis在Java?

汪兴旺
2023-03-14

我从Ruby on Rails webservice以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);

其中服务器时间是我从网络服务获得的时间。resTime 的值显示负值,约为 6 分钟。

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

共有2个答案

关项明
2023-03-14

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

爱唯
2023-03-14

与@JB Nizet注释中的假设相反,表达式< code>sdf.getCalendar()。getTimeInMillis()和< code > system . current time millis()不等效。证明:

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

如果您仔细研究< code>SimpleDateFormat和< code>DateFormat的源代码,您会发现初始化部分代码如下:

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

结论是严格避免在您的DateFormat-对象上使用getCalend()方法,它仅用作内部格式和解析处理的中间可变对象,很难说通过这种方式您将真正得到什么作为时间,而是直接使用System.currentTimeMillis()来比较您的本地时间和服务器时间。

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

 类似资料:
  • 问题内容: 我想以毫秒为单位获取当前UTC时间。我搜索了google,并得到了一些System.currentTimeMillis()确实返回UTC时间的答案。但事实并非如此。如果我执行以下操作: 这三个时间几乎都相同(由于通话,相差以毫秒为单位)。 这不是UTC时间,而是我的时区时间。如何在Android中获取当前UTC时间? 问题答案: 您显示的所有三行都将给出自unix纪元以来的毫秒数,这是

  • 我想以毫秒为单位获取当前的UTC时间。我搜索了一下google,得到了System.currentTimeMillis()确实返回UTC时间的一些答案。但事实并非如此。如果我做了以下事情: 所有三个时间几乎相同(由于通话时间不同,时间相差毫秒)。 这个时间不是UTC时间,而是我的时区时间。如何在android中获取当前UTC时间?

  • 我希望这两个实例是相等的。

  • 由于我们应用程序中的时区问题,我面临一些问题。 我们有一些相互依赖的服务,这些服务给我们提供了最短的时间。我们在EST时区,所以之前没有任何问题。最近,我们转到UTC时区,开始看到这个问题。对于我们来说,我们可能会再次来回(EST/UTC)。 所以我想做的是检查我的JVM时区,如果我的时区是UTC,我想将依赖服务的时间转换为UTC,如果我们在EST中,我什么也不做,因为依赖服务总是用EST响应。我

  • 问题内容: 为什么 打印出来? 我希望两个实例都相等。 问题答案: 答案来自(强调我的)javadoc … ZoneId用于标识用于在Instant和LocalDateTime之间进行转换的规则。有两种不同的ID类型: 固定偏移量-与UTC /格林威治标准时间完全抵消的偏移量,所有本地日期时间都使用相同的偏移量 地理区域-适用于从UTC /格林威治中查找偏移量的一组特定规则的区域 大多数固定偏移量

  • 问题内容: 无论计算机上设置的时区如何,我都需要对GMT / UTC进行任何与时间相关的操作。在代码中有任何方便的方法吗? 为了明确起见,我将所有操作都使用数据库服务器时间,但是它是根据本地时区格式化的。 谢谢! 问题答案: OP回答了这个问题,以更改正在运行的JVM的单个实例的默认时区,并设置系统属性: 如果从数据库检索Date / Time / Timestamp对象时需要设置特定的时区,请使