java.util.Date是否使用时区?
我有两台不同的电脑,每台都有不同的时区 在一台计算机中,im打印java.util.Date是否使用时区?,java,date,timezone,Java,Date,Timezone,我有两台不同的电脑,每台都有不同的时区 在一台计算机中,im打印System.currentTimeMillis(),然后在两台计算机中打印以下命令: System.out.println(新日期(123456))-->123456代表计算机1中的currentTimeMillis中的数字 第二次打印(尽管打印硬编码)会在两台计算机上产生不同的打印。 为什么会这样?因为毫秒数是UTC时间1970年1月1日之后的毫秒数。如果随后转换到不同的时区,渲染时间将不同 e、 g.123456可能对应于格林
System.currentTimeMillis()
,然后在两台计算机中打印以下命令:
System.out.println(新日期(123456))
-->123456代表计算机1中的currentTimeMillis
中的数字
第二次打印(尽管打印硬编码)会在两台计算机上产生不同的打印。
为什么会这样?因为毫秒数是UTC时间1970年1月1日之后的毫秒数。如果随后转换到不同的时区,渲染时间将不同 e、 g.123456可能对应于格林威治中午(UTC)。但在纽约,那将是一个不同的时间 要确认这一点,请与时区输出一起使用,和/或更改第二台计算机上的时区以匹配第一台计算机。请参阅 是的,它使用时区。它还应该打印出来(年前的三个字符) 为什么呢 因为像“2009年10月4日,14:20”这样的东西在不知道它所指的时区的情况下是毫无意义的——你很可能现在就能看到,因为这是我写这篇文章时的时间,它可能与你的时间相差几个小时,即使是同一时刻
计算机时间戳通常以UTC(基本上是英格兰格林威治的时区)为单位,在将其格式化为人类可读的内容时,必须考虑时区。一些迂腐的细节如何 是时区独立的。在javadoc中是这么说的 你想要关于特定时区的东西吗?那太好了 棘手的部分?当你打印这些东西时(使用或a),这涉及到一个日历(涉及一个时区)。看 它看起来确实(没有检查实现)像java.util.Date.toString()通过了DateFormat。因此,即使是我们的(大部分)时区独立类也会因为时区而陷入混乱
想从我们纯粹的无区域约会对象中去掉时区的东西吗?有。或者您可以创建自己的SimpleDataFormatter,并使用setTimeZone()控制自己使用的区域。javadoc对此进行了很好的解释, System.currentTimeMillis()
请注意,虽然返回值的时间单位为毫秒,但值的粒度取决于底层操作系统,可能更大。例如,许多操作系统以几十毫秒为单位测量时间 我知道这是一个老话题,但我不得不投票赞成你关于为什么没有时区的日期毫无意义的解释/陈述。@HelterScelter我不得不投反对票。这就像说没有重力常数,质量是没有意义的。它们都有各自的意义。java.util.Date只是在某种程度上与时区无关。从JavaSDK7 Java.util.Date.toString()复制并粘贴时区zi=Date.getZone();如果(zi!=null){sb.append(zi.getDisplayName(date.isDaylightTime(),zi.SHORT,Locale.US));/zzz}或者{sb.append(“GMT”);}
date
是一个BaseCalendar
哪个时区被设置为TimeZone.getDefaultRef()
,关键点是您正在谈论的是toString()方法。我说我没有看过toString()的实现,但怀疑它涉及日历。你刚刚证实了这一点。我们之间没有分歧。Date
对象与带时区的cdate
成员(即BaseCalendar
)一起工作。然后发生了没人真正关心的事情,Date
的行为与时区无关,只要你不打印它。注意,toString()
方法的Java文档说,如果时区信息不可用,那么zzz是空的——也就是说,它根本不包含任何字符。但是如果没有可用的时区信息(zi!=null
解析为错误条件),则代码将应用于GMT
。