不同时区的Java日期

时间:2012-11-07 13:41:30

标签: java

我有一个long值“值”,其中我用毫秒保留时间,如果我将系统的时区从UTC +2:00更改为UTC +13:00 new Date(value)返回不同的结果!

有人可以告诉我为什么以及如何让它返回给定值的相同日期,即使我的时区不同?

4 个答案:

答案 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打印结果。