我有一个long
值“值”,其中我以毫秒为单位保存时间,如果我将系统的时区从UTC +2:00
返回UTC +13:00
new Date(value)
不同的结果!
谁能告诉我为什么以及如何使它返回给定值的相同日期,即使我的时区不同?
我有一个long
值“值”,其中我以毫秒为单位保存时间,如果我将系统的时区从UTC +2:00
返回UTC +13:00
new Date(value)
不同的结果!
谁能告诉我为什么以及如何使它返回给定值的相同日期,即使我的时区不同?
不,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
。
类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));
这就是时区的工作方式。例如东部时间是 8:46,加利福尼亚是 5:46。以这种方式处理时区的方法是让一切都基于中央服务器,我建议服务器使用 GMT。然后,您从用户那里获取他们的“真实”时区的偏好。
帮自己一个大忙,避免使用 Java Calendar / Date 类。我强烈推荐使用Joda Time - 它经过深思熟虑并且没有错误。
顺便说一句,您的代码没有任何问题 - 它只是根据当前的 TimeZone 以不同的方式打印结果。