我有一个long
值“值”,其中我用毫秒保留时间,如果我将系统的时区从UTC +2:00
更改为UTC +13:00
new Date(value)
返回不同的结果!
有人可以告诉我为什么以及如何让它返回给定值的相同日期,即使我的时区不同?
答案 0 :(得分:4)
不,Date
不会返回不同的结果。 Date
只是你在毫克时间的包装,仅此而已。它并不真正了解时区,小时等。
然而! Date.toString()
使用格里高利历与您当前的时区打印日期。但即使时区不同,它仍然代表相同的时间点。
说我有这个简单的程序:
new Date(1352296028515L).toString()
通常打印(我住在CET时区):
Wed Nov 07 14:47:08 CET 2012
但我可以覆盖时区(-Duser.timezone=EST
)或在纽约运行程序以获得例如:
Wed Nov 07 08:47:08 EST 2012
然而!请注意,这两个日期实际上代表相同的小时,格林威治标准时间13:47。
简单地说:冷静下来,一切都很好,这只是远离java.util.Date
的另一个原因。
答案 1 :(得分:1)
班级java.util.Date
本身并不了解时区。自格林威治标准时间01-01-1970 00:00:00起,它是一个容器,持续数毫秒。
如果您通过简单地(显式或隐式)调用Date
来打印toString()
对象,则日期将被格式化为您的机器设置的时区。如果您将机器设置为另一个时区,则打印日期看起来会有所不同 - 但它仍然指的是同一时刻。
如果要在特定时区打印Date
对象的值,请使用SimpleDateFormat
对象并在该对象上设置时区:
Date date = ...;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
// Show the date in the UTC timezone
df.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(df.format(date));
答案 2 :(得分:0)
这就是时区的工作方式。例如,东部是8:46,加利福尼亚是5:46。以这种方式处理时区的方法是使所有内容都基于中央服务器,我建议服务器使用GMT。然后,您会从用户那里获得他们“真实”时区的偏好。
答案 3 :(得分:0)
请大家帮个忙,避免使用Java Calendar / Date类。我强烈建议使用Joda Time - 它经过深思熟虑且没有错误。
顺便说一句,您的代码没有任何问题 - 它只是根据当前的TimeZone打印结果。