我们的服务器在荷兰运行,但用户在英国使用该应用程序。
对于英国,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/