如何在像荷兰这样的CET服务器中处理英国的白天时间

时间:2017-04-03 19:00:53

标签: java datetime timezone dst

我们的服务器在荷兰运行,但用户在英国使用该应用程序。

英国2017-03-26 02:30:00是有效的日期时间,但不在荷兰。

我正在使用代码通过设置时区来转换时间。但它没有给我正确的输出。

    String toDate ="2017-03-26 02:30:00";//Valid Time in UK
    Date date = new Date();
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    // Use London's time zone to format the date in
    df.setTimeZone(TimeZone.getTimeZone("London"));

    System.out.println("Date and time in London: " + df.parse(toDate));

计划输出:伦敦的日期和时间:2017年3月26日04:30:00 CEST 2017

需要输出:伦敦的日期和时间:Sun Mar 26 02:30:00 CEST 2017

使用的Java版本:1.7。不能使用joda时间来获得某些依赖。

1 个答案:

答案 0 :(得分:1)

首先,一个细节,TimeZone.getTimeZone()是危险的,如果它不能识别ID字符串,它将默认为您提供GMT。恰好在伦敦这是非常接近正确的你可能会被愚弄一段时间。 TimeZone.getTimeZone("London")为您提供UTC(或GMT)。正如Stefan Freitag指出的那样,对于正确的英国时区,它必须是TimeZone.getTimeZone("Europe/London")

接下来是一个非常常见的误解:Date对象中没有时区。这只是一个时间点。那么为什么它被打印为Sun Mar 26 04:30:00 CEST 2017,其中CEST显然是指一个时区(中欧夏令时,在荷兰使用)?打印日期时,您隐式调用Date.toString()。此方法无条件地根据JVM的默认时区打印时间。因此,设置用​​于解析的DateFormat的时区在此处无效。因此改变JVM的时区设置,正如Hugo在评论中所做的那样有效。为英国用户获取正确输出的另一种方法是使用带有英国时区的DateFormat将日期格式化为字符串。

如果你在开始时使用Hugo的伎俩,在创建DateFormat之前,它也将拥有英国时区,你不需要打{{1​​}}(但如果你认为它可以代码更清晰,当然)。

期待有一天使用Java 8或更高版本。 java.time中的新日期和时间类通常不会带来旧版的惊喜。