获取“解析异常”

时间:2019-02-11 19:19:39

标签: java string parsing arraylist simpledateformat

我想将字符串更改为使用SimpleDateFormat类的日期格式。我从字符串列表中将字符串作为String+Integer.toString(int)传递,并将SimpleDateFormat pattern作为输入。 注意:如果我传递的实际字符串(例如“ Jan 09 2019”)成功地将字符串转换为日期,则代替String+Integer.toString(int)。我尝试了很多不同的事情。

dateList是“ MMM dd”甲酸日期的列表。 通过执行dateList.get(5)+Integer.toString(year)在该格式上添加年份,这使我可以解析异常<<-如果我像Jan 09 2019这样对日期进行硬编码,则将字符串转换为日期,而不是这样做。 finalDatesInMMMDDYYYYFormat是另一个以MMM dd yyyy格式保存日期的列表。 Utils.parseDate是我在Utils类中写的一种方法,其中提到了try-catch块。

int year = 2019;
private List<String> dateList = new ArrayList<>();
private List<Date> finalDatesInMMMDDYYYYFormat = new ArrayList<>();
final String testString = dateList.get(5)+Integer.toString(year);
finalDatesInMMMDDYYYYFormat.add(Utils.parseDate(testString, new SimpleDateFormat("MMM dd yyyy")));

预期:将字符串更改为日期并将其添加到finalDatesInMMMDDYYYYFormat

实际:获取解析异常。

2 个答案:

答案 0 :(得分:1)

java.time

    int year = 2019;
    DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("MMM dd")
            .toFormatter(Locale.ENGLISH);

    List<LocalDate> finalDatesWithoutFormat = new ArrayList<>();

    String dateString = "JAN 09";
    MonthDay md = MonthDay.parse(dateString, dateFormatter);
    finalDatesWithoutFormat.add(md.atYear(year));

    System.out.println(finalDatesWithoutFormat);

此代码段的输出为:

  

[2019-01-09]

java.time,现代的Java日期和时间API,包括一个没有年份的日期MonthDay的类,它可能比普通日期更好地满足您的目的。我的代码还显示了如何提供一年的时间来获取LocalDate(没有时间的日期)。

我建议您不要使用DateSimpleDateFormat。这些类的设计欠佳,而且已经过时,尤其是后者,非常麻烦。

您的代码出了什么问题?

根据您提供的信息,无法确定您的代码为什么不起作用。可能的解释包括以下内容,但可能还有其他解释。

  • 就像rockfarkas在另一个答案中所说的那样,在连接字符串时,您没有在月份和年份之间放置任何空格,但是用于解析的格式字符串需要在该空格。
  • 例如,如果您的月份缩写为英语,并且您的JVM的默认语言环境不是英语,则解析将失败(在极少数情况下,月份缩写相符)。您应该始终为格式化程序提供一个语言环境,以指定要解析(或产生)的字符串中使用的语言。

顺便说一句,您的变量名finalDatesInMMMDDYYYYFormat令人误解,因为Date尚未(无法拥有)格式。

链接

答案 1 :(得分:0)

如果要解析格式"MMM dd yyyy",则应在测试字符串中添加一个额外的空格,如下所示:

final String testString = dateList.get(5) + ' ' + year;