java - 如何在荷兰等 CET 运行的服务器中处理英国夏令时

标签 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 年 CEST 3 月 26 日星期日 04:30:00

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

使用的Java版本:1.7。无法对某些依赖项使用 joda 时间。

最佳答案

首先说明一下,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 设置时区在这里不起作用。因此,正如 Hugo 在评论中所做的那样,更改 JVM 的时区设置是有效的。为英国用户获得正确输出的另一种方法是使用带有英国时区的 DateFormat 将日期格式化回字符串。

如果你一开始就使用Hugo的技巧,在创建DateFormat之前,它也会有英国时区,并且你不需要调用df.setTimeZone() (当然,如果您认为这会使代码更清晰,您也可以这样做)。

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

关于java - 如何在荷兰等 CET 运行的服务器中处理英国夏令时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43192330/

相关文章:

java - 瓦丁日历 : How to display another atrribute on Event cell

python - Pandas:选择周日 23:00 至周五 23:00 之间的数据(1 年跨度)

python - 控制 x 刻度日期值

java - 如何将时区字符串转换为 Java 中的 TimeZone 对象?

java - 使用 Java 在 MongoDB 中按照本地时区插入/检索日期

python - Python 中的 Swatch 互联网时间

java - 实数(正数和负数)的中缀到后缀

java - 如何使用记事本设置sphinx4

java - ExceptionHandler 调用但不影响 http 响应

iphone - 无论用户位置或时间设置如何,获取当前 UTC 或祖鲁时间的最可靠方法是什么?