java.text.ParseException:无法解析的日期:"Tue May 13 23:58:30 IST 2014"

java.text.ParseException: Unparseable date: "Tue May 13 23:58:30 IST 2014"

我正在转换日期格式,但出现错误。我知道这个问题重复了解决方案没有帮助: 下面是我的代码,我正在转换的日期字段格式为: “2014-05-13T23:58:30.457”

val format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS",Locale.US)
val format2 = new SimpleDateFormat("yyyy-MM",Locale.US)

val result = data.filter{line=>{line.trim().startsWith("<row")}}
    .filter{line=>{line.contains("PostTypeId=\"1\"")}}
    .flatMap { line=>{
      val xml = XML.loadString(line)
      xml.attribute("CreationDate")
    }}.map{line=>{
      (format2.parse(format.parse(line.toString()).toString()),1)
    }}.reduceByKey(_+_)

我遇到以下错误:

java.text.ParseException: Unparseable date: "Tue May 13 23:58:30 IST 2014"
    at java.text.DateFormat.parse(DateFormat.java:366)
    at WhosebugAnalysis.TotalQues$$anonfun.apply(TotalQues.scala:23)
    at WhosebugAnalysis.TotalQues$$anonfun.apply(TotalQues.scala:22)

您应该将 format2.parse 更改为 format2.format

使用.parse时,SimpleDateFormat的定义格式应与String的定义格式完全一致。

p.s。特殊情况:使用Restful API服务时,如果后台服务器和本地环境有差异,也会出现这个问题。

(从中文网站翻译的附加信息:https://vimsky.com/article/2736.html

    String line = "2014-05-13T23:58:30.457";
    String reformatted = YearMonth.from(LocalDateTime.parse(line)).toString();
    System.out.println(reformatted);

这会打印

2014-05

明确指定任何格式化程序没有用处。您的字段采用 ISO 8601 格式,LocalDateTime 和 java.time 中的其他 class 解析为默认格式。 java.time 是现代 Java 日期和时间 API。 YearMonth 是日历中的一个月,正如 class 名称所说,一年零一个月。正是您所需要的。它的 toString 方法将其格式化为您想要的 yyyy-MM 格式,这也符合 ISO 8601。

过时和现代日期和时间classes

您使用的 classes,SimpleDateFormat 和隐含的 Date,早就过时了,前者尤其麻烦。我建议你避开它们。现代 API 更好用。

你的代码出了什么问题

  • parse的意思是分析一个字符串,以确定其内容的含义。此处解析 date-time 字符串会将字符串转换为 date-time 对象(DateLocalDateTime)。
  • To format 意思相反:将一些数据,这里是 date-time 对象,转换成字符串,通常是为了人类可读性或数据传输。

所以你的代码拿走了你的 2014-05-13T23:58:30.457 字符串。 toString 调用可能是多余的,只是再次 return 相同的字符串。然后它 解析 成一个 Date 对象,这很好用。在 Date 上调用 toString 会将其格式化为字符串 Tue May 13 23:58:30 IST 2014,这是你不想做的。然后您尝试使用 yyyy-MM 格式 解析 这个字符串到一个新的 Date 对象中。由于字符串没有这种格式,因此失败并出现您看到的异常。

链接

Oracle tutorial: Date Time 解释如何使用 java.time.