我们的服务器在荷兰运行,但用户在英国使用该应用程序。
对于英国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中的新日期和时间类别通常不会带来旧版本带来的惊喜。