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 对象(
Date
或 LocalDateTime
)。
- 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
.
我正在转换日期格式,但出现错误。我知道这个问题重复了解决方案没有帮助: 下面是我的代码,我正在转换的日期字段格式为: “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 对象(
Date
或LocalDateTime
)。 - 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
.