Java简单日期格式英国时间

5

我正在使用简单日期格式,以允许用户指定他们发送数据所在的时区:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,z");

这个很好用: 例如:
df.parse("2009-05-16 11:07:41,GMT");

然而,如果有人总是按伦敦时间发送时间(即考虑夏令时),应该添加什么适当的时区字符串? 例如,这个不起作用:
df.parse("2009-05-16 11:07:41,Western European Time");  
System.out.println(date);
Sat May 16 12:07:41 BST 2009

我希望将时间调整到英国夏令时中考虑。

谢谢。


你尝试过“BST”吗?我相信它代表英国夏令时(相当于美国的夏令时)。 - Jack Leow
冬天使用BST是否可以? - DD.
刚试了一下...不行。冬季的英国夏令时10点与伦敦时间的10点不同。 - DD.
3
你尝试过使用"Europe/London"吗?根据Linux的zone.tab文件,这应该是正确的时区。 - user354134
3个回答

6

在夏令时,是 BST。在其余时间里是 GMT

我建议您使用通用名称(全年通用),即 Europe/London。您可以使用类似以下的内容:

    String userInput = "2009-05-16 11:07:41,Europe/London";
    String[] tokens = userInput.split(",");

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    df.setTimeZone(TimeZone.getTimeZone(tokens[1]));
    System.out.println(df.parse(tokens[0]));

在这种情况下,输出结果为:
Sat May 16 11:07:41 GMT+01:00 2009

让用户在解析字符串中指定时区的整个意义就被打败了 - DD.
@DD - 不会。你仍然可以让用户指定一个日期,例如2009-05-16 11:07:41,Europe/London,并在代码中通过逗号分割该字符串。 - b.roth

0

那么你的问题到底是什么 - 你应该使用哪个TimeZone ID?以下代码将打印出所有可用的时区标识符列表:

for (String id : TimeZone.getAvailableIDs()) {
    System.out.println(id);
}

0

我觉得单独使用 SimpleDateFormat 是无法完全实现你想要的功能的。TimeZone.parse(String) 只接受时区,而不是时区 ID,例如:

Time Zone ID       Time Zone (Winter)      Time Zone (Summer)
-------------------------------------------------------------
Europe/London      GMT                     BST

如果parse(...)接受Europe/London,那么在春季会有一个小时不是有效的Europe/London时间,在秋季会有一个小时对应两个UTC时间。
我认为最好的方法是遵循Bruno Rothgiesser的建议,但你可以将时区ID作为单独的用户输入,或者进行额外的字符串处理步骤来分离用户输入字符串中的时区ID,并使用它来确定用户可能意味着GMT还是BST。用户的Locale可能是确定用户意思的更好方法-尽管这个想法涉及一些假设。
“用户可能意味着什么”算法必须处理两种特殊情况-您可以使用TimeZone.inDaylightTime(Date)与userTime +/- 1小时来确定是否可能有其中之一。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接