2015-10-07 204 views
0
public class TestTimeZone { 

    public static void main(String[] args) throws ParseException { 
    System.setProperty("user.timezone", "PST"); 
    TimeZone.setDefault(null); 
    Date d1 = new Date(1257062400000L); 
    Date d2 = new Date(d1.getTime() + 3600000); 
    DateFormat f = new SimpleDateFormat("yyyy-MM-dd-HH"); 
    System.out.println(f.format(d1).equals(f.format(d2))); // true 
    System.out.println(d1.equals(f.parse(f.format(d1)))); // false 
    System.out.println(d1);         // Sun Nov 01 01:00:00 PDT 2009 
    System.out.println(d2);         // Sun Nov 01 01:00:00 PST 2009 
    } 
} 
  • d1d2显然是不同的,所以它们的格式不应该是一样的。
  • 当你格式化和分析d1,你d2
  • 我设置时区PST,然后创建d1,应该创建为日期,为什么会得到创建为PDT日期?
+0

我的答案解释了为什么你看到当前的行为。我不能告诉你如何继续,因为我不知道你在努力达到什么目的。 –

回答

1

D1和D2显然是不同的,所以它们的格式不应该是相同的

那么他们就不会,如果你有一个明确的格式 - 但你不知道。 (嘿,甚至留下的时区,你只格式化到一小时,所以它是微不足道的创建不等于Date值格式化为相同的字符串。)

您正在格式化系统默认的本地时间这意味着如果时区的UTC时差恢复(例如2015年11月1日在America/Los_Angeles中),则可以有相同的本地时间出现两次......因此,您可以获得相同的字符串输出两个不同的时间。当您拨打parse时,您如何期望格式化程序能够推断出您的原始值是哪个值的信息?

请注意,在特定时区内不存在java.util.Date这样的事情 - Date仅表示自Unix时代以来的毫秒数。

另请注意,PST并非真正的时区标识符 - 您最好使用IANA标识符(如America/Los_Angeles)。如果您确实需要UTC-8的时区而不进行DST更改,则可以使用Etc/GMT + 8。 +8(而不是-8)是由于在这里使用了Posix风格的偏移量。有点混淆......另一种选择是拨打TimeZone.setDefault(new SimpleTimeZone(-28800000, "UTC-8"))

+0

我的问题是,如果我在开始时将时区设置为PST,则应根据PST格式化日期。由于在PST中,这个毫秒与PDT中的do不同。所以无论它们在PST中意味着什么,都应该是'format'的结果。它应该是11月1日0小时或2小时。然后解析会得到相同的时间。 – prongs

+0

@prongs:但正如我所说的,您并没有真正将时区设置为“PST”(尽管出现这样做) - 您已将时区设置为“太平洋时间”。如果你看'TimeZone.getDefault()',你会发现它*有*有DST。这就是我的最后一段 - 如果你真的想要一个永不调整UTC偏移的时区,不要通过缩写如PST来指定它。 –