【问题标题】:Java simple date format british timeJava简单日期格式英国时间
【发布时间】:2010-06-05 07:59:35
【问题描述】:

我使用简单的日期格式来允许用户指定他们在哪个时区发送数据:

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”吗?我相信这代表英国夏令时(相当于美国夏令时)。
  • 冬天可以用BST吗?
  • 刚刚试了一下...不起作用 冬天的英国夏令时上午 10 点与伦敦时间上午 10 点不一样。
  • 你试过“欧洲/伦敦”吗?根据 Linux 的 zone.tab,这应该是正确的区域。

标签: java datetime


【解决方案1】:

在夏令时,它是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 - 不,它没有。您仍然可以让用户指定一个日期,例如 2009-05-16 11:07:41,Europe/London,并在代码中用逗号分隔该字符串。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我认为单独使用 SimpleDateFormat 不可能完全完成您想做的事情。 TimeZone.parse(String) 只接受时区,不接受时区ID,例如:

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

    如果 parse(...) 接受欧洲/伦敦,那么春季的一小时将不是有效的欧洲/伦敦时间,而秋季的一小时将映射到两个 UTC 时间。

    我认为您能做的最好的事情就是遵循 Bruno Rothgiesser 的建议,但是您可以接受时区 ID 作为单独的用户输入,或者执行额外的字符串处理步骤以将时区 ID 与用户输入字符串分开,并使用它来确定用户可能是指 GMT 还是 BST。用户的语言环境可能是了解他/她的意思的更好方法 - 尽管该想法涉及一些假设。

    “用户可能的意思”算法必须处理两种特殊情况 - 如果您可能有其中一种情况,您可以使用 TimeZone.inDaylightTime(Date) 和 userTime +/- 1 小时来计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多