为什么这个SimpleDateFormat无法解析这个日期字符串?

5

The SimpleDateFormat:

SimpleDateFormat pdf = new SimpleDateFormat("MM dd yyyy hh:mm:ss:SSSaa");
pdf.parse("Mar 30 2010 5:27:40:140PM");引发的异常是:
java.text.ParseException: Unparseable date: "Mar 30 2010 5:27:40:140PM"

有什么想法吗?


编辑: 感谢快速回答。你们都是正确的,我只是错过了SimpleDateFormat文档中的一个关键句子 - 我应该结束今天的工作了。

4个回答

11

首先,三个字符的月份应该用MMM表示。其次,一到二位数的小时应该用h表示。第三,Mar 看起来是英语,在机器默认语言环境不同时,你需要提供一个Locale.ENGLISH,否则它可能无法正常工作。

以下代码可以正常运行:

SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy h:mm:ss:SSSa", Locale.ENGLISH);
System.out.println(sdf.parse("Mar 30 2010 5:27:40:140PM"));

结果(我的时区为GMT-4,没有夏令时):

Tue Mar 30 17:27:40 BOT 2010

另请参阅java.text.SimpleDateFormat javadoc

我不知道为什么你把它称为pdf,所以我把它改名为sdf ;)


我知道这个会出现!它叫做 pdf,因为它是我的日期格式化程序,用于解析(字符串 => 日期);我还有另一个日期格式化程序,用于格式化(解析后的日期 => 字符串)。如果我只有一个日期格式在范围内,那么我会将其命名为 sdf - Matt Ball

8

来自SimpleDateFormat javadocs:

月份: 如果模式字母的数量为3或更多,则将月份解释为文本;否则,将其解释为数字。

尝试使用类似于“MMM dd yyyy”的模式。


6

MM代表数字月份。请使用MMM。


0

java.time

我提供现代的答案。其他答案是正确的,但你使用的SimpleDateFormat类已经过时且出了名的麻烦。相反,我使用java.time,这是现代和优秀的Java日期和时间API。

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            "MMM d uuuu h:mm:ss:SSSa", Locale.ROOT);
    String dateTimeString = "Mar 30 2010 5:27:40:140PM";
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
    System.out.println(dateTime);

输出:

2010-03-30T17:27:40.140

链接:Oracle教程:日期时间,讲解如何使用java.time。


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