Java 如何在像荷兰这样运行CET的服务器上解决英国的日光节约问题

Java 如何在像荷兰这样运行CET的服务器上解决英国的日光节约问题,java,datetime,timezone,dst,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");

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

对于英国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年3月26日星期日02:30:00 CEST


使用的Java版本:1.7。无法将joda time用于某些依赖项。

首先是一个细节,
时区。getTimeZone()
是危险的,如果它无法识别ID字符串,它会默认为你的GMT。确切地说,在伦敦,这是如此接近正确,你可能会被愚弄一段时间<代码>时区。getTimeZone(“伦敦”)为您提供UTC(或GMT)。正如Stefan Freitag所指出的,必须是
时区。getTimeZone(“欧洲/伦敦”)
才能找到正确的英国时区

接下来是一个非常常见的误解:
Date
对象中没有时区。这只是一个时间点。那么它为什么会被打印为2017年3月26日04:30:00 CEST
,其中
CEST
显然是指一个时区(中欧夏季,荷兰使用)?打印日期时,隐式调用
date.toString()
。此方法根据JVM的默认时区无条件地打印时间。因此,为用于解析的
DateFormat
设置时区在此处无效。因此,正如雨果在评论中所做的那样,更改JVM的时区设置是可行的。为英国用户获得正确输出的另一种方法是使用带有英国时区的
DateFormat
将日期重新格式化为字符串

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


期待有一天使用Java8或更高版本。新的日期和时间课程通常不会带来旧课程带来的惊喜。

时区“伦敦”正确吗?我想应该是“欧洲/伦敦”,我试着在开始时使用
TimeZone.setDefault(TimeZone.getTimeZone(“欧洲/伦敦”)
,但是输出几乎是正确的:
2017年3月26日02:30:00英国夏令时
(英国夏令时而不是CEST)谢谢雨果。这对我很管用。。我得到了我想要的。但是为什么用simpledateformat设置时区不起作用呢?伦敦不使用CEST。(英国夏令时)。此外,我看不到您在这里进行任何转换,除非您在连接时将输出
Date
对象从
df.Parse
隐式转换为字符串,该字符串将使用默认时区,而不是指定给
df
的时区。
java.util.TimeZone.getDefault().getID()
的输出是什么?为了记录在案……许多功能在中被重新移植到java 6和7,并在中进一步适应了Android。@BasilBourque如果原始海报没有说“不能使用joda时间进行某些依赖性”,我会更加强调这一点我认为在这种情况下,Three-Ten Backport也不是一个好办法。希望我错了。:-)我明白,这就是为什么我发表评论的原因。我是在对后代说话,不是你