Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.Date是否使用时区?_Java_Date_Timezone - Fatal编程技术网

java.util.Date是否使用时区?

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可能对应于格林

我有两台不同的电脑,每台都有不同的时区

在一台计算机中,im打印
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