无法解析的日期:"Thu, 7 Dec 2017 07:40:40 "

Unparseable date: "Thu, 7 Dec 2017 07:40:40 "

我在尝试解析时遇到上述异常。我尝试了以下日期格式,

SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM  yyyy  HH:mm:ss ", Locale.ENGLISH);

它似乎也可以与 space 一起工作......你遇到了什么异常?

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class SimpleDateFormatExample {
 public static void main(String[] args) {
  SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy  HH:mm:ss ",Locale.ENGLISH);
   String strDate= sdf.format(new Date());
   System.out.println(strDate);
 }
}

Ouput:Fri, 08 Dec 2017 07:54:08

java.time

SimpleDateFormat class 不仅早已过时,而且出了名的麻烦。我建议您停止使用它并改用 java.time 现代 Java 日期和时间 API 也称为 JSR-310。与它一起工作要好得多。

    System.out.println(LocalDateTime.parse("Thu, 7 Dec 2017 07:40:40 ",
            DateTimeFormatter.ofPattern("E, d MMM yyyy HH:mm:ss ", Locale.ENGLISH)));

这将打印预期的日期和时间:

2017-12-07T07:40:40

出了什么问题

在您的格式模式字符串中,您在 yyyy 之前有两个 space,在 yyyy 之后有两个 space,在您的 date-time 字符串中似乎每个地方只有一个 space。虽然 SimpleDateFormat 因解析它应该拒绝的字符串而臭名昭著,但在这种情况下,它 确实 object 通过抛出 ParseException 您要拒绝的消息在问题标题中引用。

如果您将我的格式模式字符串与您的进行比较,您会发现我只使用一个 d 而您使用两个。 SimpleDateFormatdd 解析 7,其中现代 classes 更严格:d 匹配 1 位或 2 位的 date-of-month。其中 dd 需要两位数。如果需要,您当然可以利用它进行更严格的验证。

问题:我的 Java 版本可以使用现代 API 吗?

如果至少使用 Java 6,则可以。

要学习使用 java.time,请参阅 the Oracle tutorial 或在网上查找其他资源。