【问题标题】:ParseException When Parsing a Date from InputStream从 InputStream 解析日期时出现 ParseException
【发布时间】:2015-09-15 17:23:35
【问题描述】:

我在 JUnit 测试期间遇到了类似于 post 的问题,其中日期似乎可以由 SimpleDateFormat 解析,但我收到 ParseException 说:

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

我在 Java 6 下运行。

被测类FileMoveBasedOnControlFile 有一个函数getDateStringEntriesFromStream,它接受一个I​​nputStream,尝试使用MM-dd-yyyy 格式将该Stream 中的每一行解析为一个日期,将每个成功解析的日期转换为一个新格式@ 987654331@,最后将转换成功的日期输出到一个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”。

【问题讨论】:

标签: java date datetime junit stream


【解决方案1】:

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);

【讨论】:

  • @Tavor:嗯,是的——如果它没有那样做,你期望它做什么,你为什么要调用它?不过,我个人只会有两个 SimpleDateFormat 实例——一个用于解析,一个用于格式化。无需为循环的每次迭代创建一个新的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 2015-08-12
相关资源
最近更新 更多