使用SimpleDateFormatter进行无法解析的日期

时间:2017-05-28 21:06:22

标签: java simpledateformat date-parsing

我有一个日期不断给我一个错误

  AvroInputFormat<User> users = new AvroInputFormat<User>(in, User.class);
  DataSet<User> usersDS = env.createInput(users);

所有其他日期(没有单词月份)正常工作

我正在使用的代码如下:

java.text.ParseException: Unparseable date: " 5 April 2017  "

3 个答案:

答案 0 :(得分:3)

很高兴看到您对现代日期和时间课程表达的兴趣,这里只是一个让您入门的片段:

    String visitDate = " 5 April 2017  ";
    DateTimeFormatter parseFormatter 
            = DateTimeFormatter.ofPattern("d MMMM uuuu", Locale.UK);
    visitDate = visitDate.trim();
    LocalDate date = LocalDate.parse(visitDate, parseFormatter);
    // reformat to the string we like
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd_MM_uu");
    visitDate = date.format(formatter);

结果是

05_04_17

由于Java编码约定建议变量名称以小写字母开头,因此我使用小v拼写visitDate

uu很微妙,可能是你可以忽略的东西。这是一个签名的年份,0等于1 BC,-1等于2 BC等等。假设您的日期都没有,那么您可以互换使用uy

我相信SimpleDateFormat.format()LocalDate.format()都不会返回null,所以所有的空检查都是多余的。

进一步阅读的链接:Oracle tutorial: Trail: Date Time

答案 1 :(得分:0)

您只有一个SimpleDateFormatter用于解析:

SimpleDateFormat changeDate = new SimpleDateFormat("dd_MMM_yy", Locale.UK);
//Convert the string to a date
Date date = changeDate.parse(VisitDate);

它使用格式dd_MMM_yy,但是你传递了4位数字。

其余的SimpleDateFormatters用于格式化为字符串,而不是从字符串解析。只会调用第一个,因为它将能够生成给定有效日期的字符串,并且以下空值检查将阻止使用任何其他格式化程序。

答案 2 :(得分:-1)

您要解析输入字符串,如下所示:" 5 April 2017 "。但是这个输入没有模式匹配

首先请修剪输入字符串的空格

第二,请更改字符串的格式或添加其他模式以解析此字符串,因为您的月份April包含5个字母,但您没有使用MMMMM的模式。通常月份将缩短为3个字母,如:April - &gt; 4月,3月 - &gt; Mar ...