【问题标题】:Parse date with AEDT and AEST time zone in java在java中使用AEDT和AEST时区解析日期
【发布时间】:2016-04-07 10:48:43
【问题描述】:

我正在尝试解析格式字符串

Thu Apr 07 11:45:28 AEST 2016

进入日期对象。我的代码如下所示:

SimpleDateFormat parserSDF = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
try{
    Date time = parserSDF.parse("Sat Feb 01 15:00:19 AEDT 2014");
}catch(Exception e){
    e.printStackTrace();
}

但我收到“解析错误”。我无法更改日期的输入格式,也无法将时区设置为静态值,因为此代码将在 andorid 设备上运行。如何将此字符串解析为日期?

【问题讨论】:

  • 您可以使用 JSR 310 API,因为它改进了时区处理吗?
  • 没有时区之类的东西。你能详细说明我该怎么做吗?
  • 您可能需要指定语言环境
  • 也不适用于语言环境。

标签: java date timezone


【解决方案1】:

使用java.time 框架(JSR 310),您可以:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss zzz yyyy");
ZonedDateTime zdt = ZonedDateTime.parse("Sat Feb 01 15:00:19 AEDT 2014", dtf);
System.out.println(zdt);

...打印:

2014-02-01T15:00:19+11:00[澳大利亚/悉尼]

虽然我不确定为什么选择悉尼而不是墨尔本。

【讨论】:

  • 看起来它选择了这个列表中的最后一个,按时区名称的字母顺序排列:澳大利亚/居里、澳大利亚/霍巴特、澳大利亚/墨尔本、澳大利亚/悉尼。这些时区中的每一个都与输入一致,并且在此特定日期彼此一致。我很好奇如果你给它日期/时间/缩写匹配两个或多个彼此一致的时区,它会做什么。
  • 例如“Thu Apr 07 11:45:28 BST 2016”。这与欧洲/伦敦 2016-04-07 10:45:28 UTC 和太平洋/布干维尔 2016-04-07 00:45:28 UTC 匹配。
  • @HowardHinnant “我很好奇……如果它……匹配两个或多个不一致的时区……”这就是为什么您应该避免使用那些 3-4 个字母的时区缩写 首先。它们不是实时时区,不是标准化的,也不是唯一的(例如:IST 是印度时间和爱尔兰时间等)。以continent/region 的格式使用proper time zone names。为了您的成功和理智,请避免使用那些旧的日期时间类(java.util.Date/.Calendar 等)。使用 Lawrey 在此处显示的 java.time 类。
  • @BasilBourque:谢谢,我对这一切都比较熟悉。我的好奇心是软件如何响应这样的请求。我认为这个问题/答案有助于我设计 my C++ 时区库将如何响应:howardhinnant.github.io/tz.html#Parsing
  • 呵呵:“澳大利亚/库里”。我认为这是一个自动更正的“澳大利亚/堪培拉”(这是我住的地方),但澳大利亚/居里,我喜欢它;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2018-01-01
  • 2016-07-23
相关资源
最近更新 更多