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
}
}
d1
和d2
明显不同,因此其格式不应相同。d1
时,您会获得d2
d1
,它应该创建为PST
日期,为什么它会被创建为PDT日期?答案 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"))
。