1

我的要求是这样的:

我在数据库和时区中以毫秒为单位节省时间。例如,以毫秒为单位的时间为 1223123123232long 而时区为Asia/Calcutta. 我必须将其转换Africa/Asmara为时区。

long l = 1223123123232l;
TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta");
long tzOff = tz.getOffset(l);
java.util.Date d = new Date(l-tzOff);   // WHY THIS??
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
df.setTimeZone(TimeZone.getTimeZone("Africa/Asmara"));// required timezone
String s = df.format(d);
System.out.println(s);

要检查我指的是这个:链接

我的问题是:

  1. 如果时区只是不同格式的时间表示(地理区域从 GMT 偏移),为什么我需要从实际时间中减去偏移时间(l-tzOff)
  2. 为什么我不能忽略保存在数据库中的时区,而只考虑我想要转换日期的时区?

就像是:

long l = 1223123123232l;
java.util.Date d = new Date(l);
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
df.setTimeZone(TimeZone.getTimeZone("Africa/Asmara"));// required timezone
String s = df.format(d);
System.out.println(s);

我的系统时区是Asia/Calcutta,我想将Africa/Bujumbura时区中的日期转换为时Europe/Vatican区。上面的代码在这种情况下不起作用?为什么会这样?

4

2 回答 2

1

Java 日期不知道时区。因此,如果我在 New-York 保存 14H00,它将与 Paris 中的 14H00 不同,尽管毫秒值是相同的。您需要使用唯一的参考来保存日期。人们经常选择GMT+0。

如果需要跨时区查看当地时间,可以使用我在这里开发的工具。

要回答您的问题:

  1. 时区不是时间的表示,它是时间的本地化。减去偏移量的原因是确保所有时间都是根据相同的参考定义的。
  2. 因为你会得到错误的结果和错误的日期。
于 2013-02-05T10:50:02.560 回答
1

new Date(long)采用自GMT纪元以来的毫秒数。由于在您的情况下l是自其他某个时间点(即 1970 年 1 月 1 日,亚洲/加尔各答 00:00:00)以来的毫秒数,您必须先将其转换为 GMT。这是通过减去相关的时区偏移量来完成的。

于 2013-02-05T10:50:32.673 回答