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

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

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

    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年3月26日星期日2:30:00

使用的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中的新日期和时间类别通常不会带来旧版本带来的惊喜。

09-28 02:37