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