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

时间:2018-03-07 21:50:26

标签: java parsing simpledateformat

我正在转换日期格式,但却收到错误。我知道问题重复,解决方案没有帮助: 下面是我的代码,我转换的日期字段是格式: “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)

2 个答案:

答案 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可以更好地使用。

您的代码出了什么问题

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

因此,您的代码使用了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