我正在转换日期格式,但却收到错误。我知道问题重复,解决方案没有帮助: 下面是我的代码,我转换的日期字段是格式: “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)
答案 0 :(得分:0)
您应该将format2.parse
更改为format2.format
。
使用.parse
时,SimpleDateFormat
的定义格式应与字符串格式完全相同。
P.S。特殊情况:使用Restful API服务时,如果后端服务器和本地环境之间存在差异,问题也会出现。
(中文网站翻译的其他信息:https://vimsky.com/article/2736.html)
答案 1 :(得分:0)
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可以更好地使用。
Date
或LocalDateTime
)。因此,您的代码使用了2014-05-13T23:58:30.457
字符串。 toString
调用可能是多余的,只需再次返回相同的字符串即可。然后它解析它到一个Date
对象,这很好用。在toString
上调用Date
将其格式化为字符串Tue May 13 23:58:30 IST 2014
,这是您不想做的事情。然后,您尝试使用格式Date
将此字符串解析到新的yyyy-MM
对象中。由于字符串没有这种格式,因此您看到的例外情况失败了。
Oracle tutorial: Date Time解释如何使用java.time
。