Java在PST中创建日期会在PDT中返回日期

时间:2015-10-07 09:08:22

标签: java timezone simpledateformat dst

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,它应该创建为PST日期,为什么它会被创建为PDT日期?

1 个答案:

答案 0 :(得分:1)

  

d1和d2明显不同,因此它们的格式不应相同

如果你有一个明确的格式,他们就不会这样 - 但你没有。 (哎呀,即使把时区放在一边,你只是格式化为小时,所以创建格式化为相同字符串的不相等的Date值是微不足道的。)

您正在格式化系统默认时区中的本地时间,这意味着如果时区的UTC偏移量返回(例如2015年11月1日在America / Los_Angeles中),则可以使用相同的本地时间时间发生两次...所以你得到两个不同时间的相同的字符串输出。当您致电parse时,您希望格式化程序如何推断出您所指出的原始值的信息?

请注意,在特定时区内没有java.util.Date这样的东西 - Date只表示自Unix时代以来的毫秒数。

另请注意,PST实际上不是时区标识符 - 您最好使用IANA标识符,例如America / Los_Angeles。如果您真的想要一个没有DST更改的UTC-8时区,您可以使用Etc / GMT + 8代替。 +8(而不是-8)是由于在这里使用Posix式偏移。有点令人困惑......另一种选择是拨打TimeZone.setDefault(new SimpleTimeZone(-28800000, "UTC-8"))