2

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

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

4

4 回答 4

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 UTC。

简而言之:冷静下来,一切都很好,这只是另一个远离的理由java.util.Date

于 2012-11-07T13:44:14.377 回答
1

java.util.Date本身对时区一无所知。自 01-01-1970, 00:00:00 GMT 以来,它是一个毫秒数的容器。

如果您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));
于 2012-11-07T13:45:20.107 回答
0

这就是时区的工作方式。例如东部时间是 8:46,加利福尼亚是 5:46。以这种方式处理时区的方法是让一切都基于中央服务器,我建议服务器使用 GMT。然后,您从用户那里获取他们的“真实”时区的偏好。

于 2012-11-07T13:47:56.920 回答
0

帮自己一个大忙,避免使用 Java Calendar / Date 类。我强烈推荐使用Joda Time - 它经过深思熟虑并且没有错误。

顺便说一句,您的代码没有任何问题 - 它只是根据当前的 TimeZone 以不同的方式打印结果。

于 2012-11-07T13:48:44.510 回答