java.util.Date是否使用TimeZone?

Udi*_*Udi 23 java timezone date

我有2台不同的计算机,每台计算机都有不同的TimeZone.

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

第二个打印(虽然键入硬编码)导致两台计算机中的打印不同.这是为什么?

Joh*_*n M 49

一些迂腐细节怎么样?

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

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

棘手的部分?当你打印这些东西(使用java.text.DateFormat子类)时,它涉及一个Calendar(涉及一个时区).请参见DateFormat.setTimeZone().

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

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

  • `Date`对象使用带有时区的`cdate`成员(具有`BaseCalendar`).然后发生了没有人真正关心的事情,并且`Date`表现出与时区无关,只要你不打印它.并不意味着与你的答案相矛盾. (4认同)
  • 关键是你在谈论toString()方法.我说我没有看过toString()实现,但怀疑它涉及到Calendar.你刚刚证实了这一点.我们之间没有分歧. (2认同)

Mic*_*rdt 7

这是为什么?

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

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

  • 我知道这是一个古老的话题,但是不得不投票赞成您对为什么没有时区的日期毫无意义的解释/陈述。 (2认同)

Bri*_*new 5

因为毫秒数是UTC时间1/1/1970之后的毫秒数.如果您然后转换为不同的时区,则渲染时间将不同.

例如,123456可以对应于格林威治中午(UTC).但那在纽约将是一个不同的时期.

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