解析来自InputStream的日期时的ParseException

我在JUnit测试期间遇到类似于这篇文章的问题,其中日期似乎可以通过SimpleDateFormat解析,但是我得到一个ParseException:

java.text.ParseException: Unparseable date: "05-13-2013"

我在Java 6下运行。

被测试的类FileMoveBasedOnControlFile有一个函数getDateStringEntriesFromStream ,它接受InputStream,尝试使用MM-dd-yyyy格式将该Stream中的每一行解析为Date,将每个成功解析的日期转换为新格式yyyy-MM-dd ,并最终将成功转换的日期输出到ArrayList。

'05 -11-2013'似乎得到很好的解析。 测试'05 -13-2013'中的下一个日期没有。 我很茫然,它似乎不像InputStream(或' n')应该影响这段代码。 我尝试了' r n',这也没有奏效。

在测试过程中,以下代码将解析第一个日期,但不是第二个日期:

@Test
    public void testMultipleValidEntries() throws IOException
    {
        StringBuilder strBuilder = new StringBuilder();

        String date1 = "05-11-2013";
        String date2 = "05-13-2013";
        String date3 = "05-16-2013";

        strBuilder.append(date1 + "n");
        strBuilder.append(date2 + "n");
        strBuilder.append(date3);

        FileMoveBasedOnControlFile fileMoveBasedOnControlFile = new FileMoveBasedOnControlFile();

        InputStream inputStream = new ByteArrayInputStream(strBuilder.toString().getBytes("UTF-8"));

        ArrayList<String> entries = fileMoveBasedOnControlFile.getDateStringEntriesFromStream(inputStream);

        assertTrue(entries.size() == 3);

        assertTrue(entries.get(0).equals("2013-05-11"));
        assertTrue(entries.get(1).equals("2013-05-13"));
        assertTrue(entries.get(2).equals("2013-05-16"));
    }

这是正在测试的类功能:

public ArrayList<String> getDateStringEntriesFromStream(InputStream inputStream) throws IOException
    {
        ArrayList<String> controlFileEntries = new ArrayList<String>();
        BufferedReader controlFileReader = new BufferedReader(new InputStreamReader(inputStream));
        String controlFileEntry;

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(ORIGINAL_DATE_FORMAT);
        simpleDateFormat.setLenient(false);

        LOG.info("Reading stream.");
        while( (controlFileEntry = controlFileReader.readLine()) != null)
        {
            try
            {
                Date controlFileDate = simpleDateFormat.parse(controlFileEntry);
                simpleDateFormat.applyPattern(NEW_DATE_FORMAT);
                String newDateString = simpleDateFormat.format(controlFileDate);
                controlFileEntries.add(newDateString);
                LOG.info("Got " + newDateString + ".");
            }
            catch(ParseException e)
            {
                LOG.info("Invalid date entry '" + controlFileEntry  + "'.");
            }
        }
        if (controlFileEntries.size() == 0)
        {
            LOG.info("Stream is empty.");
        }
        return controlFileEntries;
    }

ORIGINAL_DATE_FORMAT为'MM-dd-yyyy'且NEW_DATE_FORMAT为'yyyy-MM-dd'。


SimpleDateFormat声明移至您的循环中。 它适用于第一个Date ,但之后失败,因为它不会重新初始化为您的ORIGINAL_DATE_FORMAT

LOG.info("Reading stream.");
while( (controlFileEntry = controlFileReader.readLine()) != null)
{
  // Every iteration should start with the ORIGINAL_DATE_FORMAT
  SimpleDateFormat simpleDateFormat = new SimpleDateFormat(ORIGINAL_DATE_FORMAT);
  simpleDateFormat.setLenient(false);
链接地址: http://www.djcxy.com/p/18607.html

上一篇: ParseException When Parsing a Date from InputStream

下一篇: SimpleDateFormat returns wrong date value during parse