java.util.Date是否使用TimeZone?

时间:2009-10-04 11:49:55

标签: java date timezone

我有两台不同的计算机,每台计算机都有不同的TimeZone。

在一台计算机上打印System.currentTimeMillis(),然后在两台计算机上打印以下命令: System.out.println(new Date(123456)); - > 123456代表计算机#1中currentTimeMillis的数字。

在两台计算机中,第二次打印(虽然是键入的硬编码)导致不同的打印。 那是为什么?

5 个答案:

答案 0 :(得分:49)

一些迂腐的细节怎么样。

java.util.Date与时区无关。在javadoc中说得很对。

你想要一个特定时区的东西?那是java.util.Calendar

棘手的部分?当您打印此内容(包含java.text.DateFormatsubclass)时,涉及日历(涉及时区)。请参阅DateFormat.setTimeZone()

它确实看起来(没有检查过实现),如java.util.Date.toString()通过DateFormat。因此,即使我们(大多数)与时区无关的类也会被时区弄乱。

想从我们纯粹的无区域Date对象中获取时区内容吗?有Date.toGMTString()。或者您可以创建自己的SimpleDateFormatter并使用setTimeZone()来控制自己使用的区域。

答案 1 :(得分:7)

  

为什么会这样?

因为像“2009年10月4日14:20”之类的东西在没有知道它所指的时区的情况下毫无意义 - 你现在很可能会看到它,因为这是我写这篇文章的时间,它可能相差几个小时从你的时间开始,即使它是在同一时刻。

计算机时间戳通常以UTC(基本上是英格兰格林威治的时区)来衡量,并且在将它们格式化为人类可读的东西时必须考虑时区。

答案 2 :(得分:5)

因为毫秒数是UTC时间1/1/1970之后的毫秒数。如果您转换为其他时区,则渲染时间会有所不同。

e.g。 123456可以对应于格林威治中午(UTC)。但在纽约这将是一个不同的时期。

要确认这一点,请将SimpleDateFormat与时区输出一起使用,和/或更改第二台计算机上的时区以匹配第一台时区。

答案 3 :(得分:2)

请参阅https://docs.oracle.com/javase/7/docs/api/java/util/Date.html#toString()

是的,它正在使用时区。它也应该打印出来(一年前的三个字符)。

答案 4 :(得分:2)

javadoc很好地解释了这一点, System.currentTimeMillis的() 请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。