为什么SimpleDateFormat提供不同的时间偏移?

时间:2016-05-24 06:31:43

标签: java java-7 simpledateformat timezone-offset

我正在将旧格式的几个日期转换为新格式。但其输出包含格式化字符串中的不同时区。示例程序:

public class Dated {

 private static final DateFormat OLD_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 private static final DateFormat NEW_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

 public static void main(String[] args) throws ParseException {
      List<String> list = Arrays.asList(
                "2015-01-18 00:00:00",
                "2016-01-18 00:00:00",
                "2016-03-11 00:00:00",
                "2016-03-13 00:00:00",
                "2016-05-18 00:00:00",
                "2016-05-19 00:00:00",
                "2016-05-20 00:00:00",
                "2016-11-09 00:00:00");

      System.out.println(Locale.getDefault());

      for (String key : list) {
           System.out.println(NEW_FORMAT.format(OLD_FORMAT.parse(key)));
      }
  }
}

同样的程序在我的电脑上运行正常,并且我的语言环境的偏移正确(且不变)。但是当我在运行实际应用程序的服务器中执行它时,会得到以下结果:

en_US

2015-01-18T00:00:00.000-08:00
2016-01-18T00:00:00.000-08:00
2016-03-11T00:00:00.000-08:00
2016-03-13T00:00:00.000-08:00
2016-05-18T00:00:00.000-07:00
2016-05-19T00:00:00.000-07:00
2016-05-20T00:00:00.000-07:00
2016-11-09T00:00:00.000-08:00

我想知道为什么会这样?我在代码中遗漏了什么,或者只是SimpleDateFormat的错误实现?

注意:我对任何Java 8Joda-time解决方案都不感兴趣。

1 个答案:

答案 0 :(得分:3)

您的时区适用于5月份的夏令时。冬季为UTC-8,夏季为UTC-7。