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 StackOverflowAnalysis.TotalQues$$anonfun$5.apply(TotalQues.scala:23)
at StackOverflowAnalysis.TotalQues$$anonfun$5.apply(TotalQues.scala:22)
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 中的其他类解析为默认值的格式。java.time 是现代的 Java 日期和时间 API。YearMonth是日历中的月份,正如类名所说,一年和一个月。正是您所需要的。它的toString方法将其格式化为您想要的yyyy-MM格式,这也符合ISO 8601。

过时的和现代的日期和时间类

你使用的类,SimpleDateFormat和隐式Date,早已过时,前者尤其臭名昭著地麻烦。我建议你避免它们。现代 API 使用起来要好得多。

代码中出了什么问题

  • 解析意味着分析字符串以确定其内容的含义。在这里解析日期时间字符串会将字符串转换为日期时间对象(DateLocalDateTime)。
  • 格式化意味着相反:将一些数据(此处为日期时间对象)转换为字符串,通常用于人类可读性或数据传输。

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

链接

Oracle 教程:解释如何使用java.time的日期时间。

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

当使用.parse时,SimpleDateFormat的定义格式应该与 String 的格式完全相同。

p.s. 特殊情况:使用 Restful API 服务时,如果后端服务器和本地环境之间存在差异,问题也会显现出来。

(补充信息翻译自中文网站:https://vimsky.com/article/2736.html)

最新更新