无法解释的日期:“星期四,2017年12月7日07:40:40”

时间:2017-12-08 07:24:21

标签: java simpledateformat date-parsing

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

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

2 个答案:

答案 0 :(得分:1)

java.time

SimpleDateFormat课程不仅已经过时了,而且也是出了名的麻烦。我建议您停止使用它,并使用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之后有两个空格,在这个日期时间字符串中,每个地方只有一个空格。虽然SimpleDateFormat对于解析它应该拒绝的字符串是臭名昭着的,但在这种情况下, 对象通过抛出你在问题标题中引用的消息ParseException。 / p>

如果您将我的格式模式字符串与您的格式比较,您会注意到我只使用了一个d,其中您使用了两个。 SimpleDateFormat使用7解析dd,其中现代类更严格:d匹配1或2位数的日期。其中dd需要两位数。如果需要,您当然可以利用它进行更严格的验证。

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

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

  • 在Java 8及更高版本中,内置了新的API。
  • 在Java 6和7中获取the ThreeTen Backport,新类的backport({3}}的ThreeTen)。
  • 在Android上,使用Android版的ThreeTen Backport。它被称为ThreeTenABP,在JSR 310中有详尽的解释。

要学习使用java.time,请参阅this question: How to use ThreeTenABP in Android Project或在网上查找其他资源。

答案 1 :(得分:0)

它似乎也适用于空间......你得到什么例外?

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

输出:星期五,2017年12月8日07:54:08