无法使用AM/PM标记解析DateTime-string

aks*_*mit 15 java simpledateformat

我想格式化的字符串如下所示:String datetime ="9/1/10 11:34:35 AM"

以下SimpleDateFormat模式的工作原理:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss");
Date d = sdf.parse(datetime);
System.out.println(d);

Output> [Wed Sep 01 11:34:35 CEST 2010]
Run Code Online (Sandbox Code Playgroud)

但是我也需要解析AM/PM标记,当我将其添加到模式时,我收到一个异常.

无效的模式:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss a");
Run Code Online (Sandbox Code Playgroud)

我也试过这个也有同样的例外:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss aa");
Run Code Online (Sandbox Code Playgroud)

例外:

java.text.ParseException: Unparseable date: "9/1/10 11:34:35 AM"
Run Code Online (Sandbox Code Playgroud)

我查看了http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#text上的API,但似乎无法找到我做错的地方.

有什么建议?

Mor*_*itz 32

一种可能性是您的默认值Locale具有不同的AM/PM符号.构建日期格式时,Locale除非您真的想使用系统的默认格式,否则应始终提供日期格式Locale,例如:

SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm:ss a", Locale.US)
Run Code Online (Sandbox Code Playgroud)

  • 这里的教训是,在进行日期时间工作时,**始终指定所需/预期的区域设置和时区**。如果省略其中一个,则您将隐式依赖 JVM 当前的默认值。额外提示:谷歌“Joda-Time”和“java.time”。 (2认同)

Ole*_*.V. 6

现代答案:

    String datetime = "9/1/10 11:34:35 AM";
    LocalDateTime dt = LocalDateTime.parse(datetime, 
            DateTimeFormatter.ofPattern("M/d/yy h:mm:ss a", Locale.ENGLISH));
Run Code Online (Sandbox Code Playgroud)

这产生了LocalDateTime2010-09-01T11:34:35。不过要注意两位数的年份;DateTimeFormatter将假设 2000 年到 2099 年。对于我的生日,这将是不正确的。

我们仍然需要提供语言环境。由于 AM/PM 标记在英语以外的其他语言环境中几乎不使用,我认为Locale.ENGLISH这是一个相当安全的赌注。请用自己的代替。

其他答案在 2010 年和 2011 年都是很好的答案。在 2014 年,上述内容已经有效,我会更喜欢它。