无法使用 AM/PM 标记解析日期时间字符串

2022-09-01 21:59:42

我要格式化的字符串如下所示:字符串 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]

但是,我还需要解析AM / PM标记,当我将其添加到模式中时,我会收到异常。

不起作用的模式:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss a");

我也尝试过同样的例外:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss aa");

例外:

java.text.ParseException: Unparseable date: "9/1/10 11:34:35 AM"

我已经查看了 http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#text 的API,但canät似乎找到了我做错的地方。

有什么建议吗?


答案 1

一种可能性是,您的默认值对 AM/PM 具有不同的符号。在构造日期格式时,除非您确实想使用系统的默认值,否则应始终提供 a,例如:LocaleLocaleLocale

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

答案 2

现代答案:

    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));

这产生了 2010-09-01T11:34:35。不过,要小心两位数的年份; 将假定为 2000 年到 2099 年。对于我的生日来说,这是不正确的。LocalDateTimeDateTimeFormatter

我们仍然需要提供区域设置。由于AM /PM标记在英语以外的其他语言环境中几乎不被使用,因此我认为这是一个相当安全的选择。请替换您自己的。Locale.ENGLISH

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


推荐