【问题标题】:Getting "parse exception"获取“解析异常”
【发布时间】:2019-02-11 19:19:39
【问题描述】:

我想将字符串更改为我正在使用SimpleDateFormat 类的日期格式。我从字符串列表中将字符串作为String+Integer.toString(int) 传递,并将SimpleDateFormat pattern 作为输入传递。 注意:如果我传递像“2019 年 1 月 9 日”这样的实际字符串,则不是 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

实际:获取解析异常。

【问题讨论】:

  • edit您的问题包括异常的堆栈跟踪。
  • 在您的格式字符串中,日期和年份之间为空白。在你的测试字符串中没有。
  • 你应该得到一个IndexOutOfBoundsException,试图访问空dateList的第6个元素。请edit您的问题并发布实际代码。
  • 您可以将dateList.get(5) 的值粘贴到您的问题中吗?
  • 您的问题含糊不清。请发布整个代码或说明变量的值。此外,堆栈跟踪也会有所帮助。

标签: java string parsing arraylist simpledateformat


【解决方案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);

这个 sn-p 的输出是:

[2019-01-09]

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

我建议你不要使用DateSimpleDateFormat。这些类的设计很差而且过时了,尤其是后者出了名的麻烦。

你的代码出了什么问题?

根据您提供的信息,无法判断您的代码为何不起作用。可能的解释包括以下,但可能还有其他的。

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

顺便说一句,您的变量名 finalDatesInMMMDDYYYYFormat 具有误导性,因为 Date 没有(不能有)格式。

链接

【讨论】:

    【解决方案2】:

    如果你想解析格式"MMM dd yyyy",你应该像这样在你的测试字符串中添加一个额外的空格:

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

    【讨论】:

    • 也试过了。它也没有帮助。
    • 您可以将dateList.get(5) 的值粘贴到您的问题中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多