为什么这个SimpleDateFormat不能解析这个日期字符串?

时间:2010-04-08 21:37:46

标签: java parsing date simpledateformat

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 个答案:

答案 0 :(得分: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"));

结果(我在格林尼治标准时间4点没有DST):

Tue Mar 30 17:27:40 BOT 2010

另见java.text.SimpleDateFormat javadoc

为什么你叫它pdf超出我的范围,所以我将其重命名为sdf;)

答案 1 :(得分:8)

来自SimpleDateFormat javadocs

  

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

尝试使用“MMM dd yyyy”等模式

答案 2 :(得分:6)

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

答案 3 :(得分: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 tutorial: Date Time解释了如何使用java.time。