【问题标题】:Java Creating a date in PST returns a date in PDTJava 在 PST 中创建日期会返回 PDT 中的日期
【发布时间】:2016-01-04 10:41:25
【问题描述】:
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 日期?

【问题讨论】:

  • 我的回答解释了为什么你会看到当前的行为。我无法就如何继续向您提供任何建议,因为我不知道您要实现什么目标。

标签: java timezone simpledateformat dst


【解决方案1】:

d1 和 d2 明显不同,所以它们的格式不应该相同

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

您正在系统默认时区中格式化本地时间,这意味着如果时区的 UTC 偏移量返回(例如,在 2015 年 11 月 1 日的美国/洛杉矶),您可以使用相同的本地时间时间出现两次......所以你在两个不同的时间得到相同的字符串输出。当您调用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"))

【讨论】:

  • 我的问题是,如果我一开始就将时区设置为 PST,那么应该根据 PST 格式化日期。由于在 PST 中,毫秒意味着与 PDT 中的 do 不同。所以无论它们在 PST 中的含义是什么,都应该是format 的结果。它应该是 11 月 1 日 0 小时或 2 小时。然后解析回来将给出相同的时间。
  • @prongs:但正如我所说,您还没有真正将时区设置为“PST”(尽管看起来这样做) - 您已将时区设置为“太平洋时间”。如果您查看TimeZone.getDefault(),您会发现它确实有夏令时。这就是我最后一段的内容 - 如果您真的想要一个永远不会调整其 UTC 偏移量的时区,请不要通过 PST 之类的缩写来指定它。
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2019-11-08
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多