java.util.Date是否使用TimeZone?

我有两台不同的电脑,每台都有不同的TimeZone。

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

第二个打印(虽然打字硬编码)导致不同的打印,在两台计算机。 这是为什么?

如何一些迂腐的细节。

java.util.Date是时区无关的。 在javadoc说得很对。

你想要某个特定的时区? 这是java.util.Calendar 。

棘手的部分? 当你打印这个东西(使用java.text.DateFormat或一个子类 ),涉及一个日历(涉及时区)。 请参阅DateFormat.setTimeZone() 。

它确实看起来(没有检查实现)像java.util.Date.toString()通过一个DateFormat。 所以,即使我们(大部分)不依赖时区的类也会在时区中混乱。

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

因为毫秒数是UTC时间1970年1月1日以后的毫秒数。 如果您随后翻译到不同的时区,则呈现的时间将有所不同。

例如123456可能对应于格林威治(UTC)的正午。 但那在纽约将是另外一回事了。

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

这是为什么?

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

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

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

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

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