如何解决 convert String date from xml file to an int format 的错误?

How to solve the error convert String date from xml file to an int format?

我今天也发现自己面临日期问题,我从 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 "

问题出在你的线路上

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 " 你有前导和尾随 space,TueFeb 部分是英语而不是法语。

将这些行更改为

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

它会起作用。

我建议你扔掉过时的类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);

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

我关于删除 space 的建议:

    dateq = dateq.trim();

这将适用于所有白色space,而不仅仅是 space 个字符,如果有 0、1、2 个或多个字符,它也适用。将此行插入正确的位置后,我们得到 java.time.format.DateTimeParseException: Text 'Tue Feb 08 12:30:27 +0000 2011' could not be parsed at index 0。几乎是同一条消息!这次我们在字符串的开头没有看到 space,但它仍然表示问题出在索引 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