如何解决错误将String date从xml文件转换为int格式?

时间:2017-06-04 22:27:14

标签: java xml simpledateformat datetime-parsing

我今天也发现自己面临日期问题,我从字符串格式的xml文件中提取日期,但是当我尝试将其转换为int格式时,我有一个错误。

这是我的代码的一部分:

DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("top");
for (int j=0; j<= inputFile.length();j++)
    for (int temp =0; temp < nList.getLength(); temp++) {
         j++;
         System.out.println("---------------------------------------");
         Node nNode = nList.item(temp);
         System.out.println("\n La requete numero " +j+ " " + nNode.getNodeName());
         if (nNode.getNodeType() == Node.ELEMENT_NODE) {
             Element eElement = (Element) nNode;
             dateq=eElement.getElementsByTagName("querytime").item(0).getTextContent();
             System.out.println("date de la requete est " +dateq);
             DateFormat dfq = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.FRENCH);
             Date date1 = dfq.parse(dateq);
             System.out.println("new date: " +date1);

,输出为:

date de la requete est  Tue Feb 08 12:30:27 +0000 2011 
java.text.ParseException: Unparseable date: " Tue Feb 08 12:30:27 +0000 2011 "

2 个答案:

答案 0 :(得分:1)

your previous question一样,我建议你扔掉过时的课程SimpleDateFormat和朋友。现代课程通常对程序员更友好。

让我们尝试一下实验:

    String dateq = " Tue Feb 08 12:30:27 +0000 2011 ";
    DateTimeFormatter dtfFr = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss xx uuuu",
                                                          Locale.FRENCH);
    OffsetDateTime date1 = OffsetDateTime.parse(dateq, dtfFr);

您的异常消息清楚地表明在字符串的开头和结尾有空格(或其他不可见的字符),所以我也把它们放在我的字符串中。除此之外,你的消息只是说日期是不可解析的,不是为什么。相反,上面的代码给出了java.time.format.DateTimeParseException: Text ' Tue Feb 08 12:30:27 +0000 2011 ' could not be parsed at index 0。索引0,即第一个空格所在的位置,所以它已经有点帮助了。

我建议删除空格:

    dateq = dateq.trim();

这将适用于所有空格,而不仅仅是空格字符,如果有0,1,2或多个空格字符,它将起作用。在正确的位置插入此行,我们得到java.time.format.DateTimeParseException: Text 'Tue Feb 08 12:30:27 +0000 2011' could not be parsed at index 0。这几乎是同一个消息!这次我们在字符串的开头看不到空格,但它仍然说问题是在索引0处。现在它说的是“Tue”。该消息再次提到了这一点,因为“Tue”的问题是英语,并且您提供了Locale.FRENCH的语言环境。看到这一点后,并不困难:

    System.out.println("date de la requete est " + dateq);
    dateq = dateq.trim();
    DateTimeFormatter dtfEng = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss xx uuuu",
                                                           Locale.ENGLISH);
    OffsetDateTime date1 = OffsetDateTime.parse(dateq, dtfEng);
    System.out.println("new date: " + date1);

打印:

date de la requete est  Tue Feb 08 12:30:27 +0000 2011 
new date: 2011-02-08T12:30:27Z

如果您事先不知道您是否会有英语或法语日期,请尝试两者:

    dateq = dateq.trim();
    DateTimeFormatter dtfEng = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss xx uuuu",
                                                           Locale.ENGLISH);
    DateTimeFormatter dtfFr = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss xx uuuu",
                                                          Locale.FRENCH);
    OffsetDateTime date1;
    try {
        date1 = OffsetDateTime.parse(dateq, dtfEng);
    } catch (DateTimeParseException dtpe) {
        // didn’t work in English, try French
        date1 = OffsetDateTime.parse(dateq, dtfFr);
    }

这会同时处理dim. janv. 23 24:00:00 +0000 2011Tue Feb 08 12:30:27 +0000 2011

答案 1 :(得分:0)

问题出在您的行中

DateFormat dfq = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.FRENCH);
Date date1 = dfq.parse(dateq);

你有一个ParseException,因为在" Tue Feb 08 12:30:27 +0000 2011 " 你有前导和尾随空格,而TueFeb部分是英文但不是法文。

将这些行更改为

DateFormat dfq = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
Date date1 = dfq.parse(dateq.trim());

它会起作用。