Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决将字符串日期从xml文件转换为int格式的错误?_Java_Xml_Simpledateformat_Datetime Parsing - Fatal编程技术网

Java 如何解决将字符串日期从xml文件转换为int格式的错误?

Java 如何解决将字符串日期从xml文件转换为int格式的错误?,java,xml,simpledateformat,datetime-parsing,Java,Xml,Simpledateformat,Datetime Parsing,今天,我还发现自己面临着日期问题,我以字符串格式从xml文件中提取了日期,但当我尝试将其转换为int格式时,出现了一个错误 这是我代码的一部分: DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); System.out.println("Root element :" +

今天,我还发现自己面临着日期问题,我以字符串格式从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);

问题出在你身上

DateFormat dfq = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.FRENCH);
Date date1 = dfq.parse(dateq);
您得到了一个
ParseException
,因为在
中“2011年2月8日星期二12:30:27+0000”
您有前导和尾随空格,部分
Tue
Feb
是英语,但不是法语

将这些行更改为

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);
异常消息清楚地显示字符串的开头和结尾都有空格(或其他不可见的字符),所以我也将它们放在了字符串中。除此之外,你的留言只是说这个日期是不可接受的,不是为什么。相反,上面的代码给出了
java.time.format.DateTimeParseException:无法在索引0处解析文本“Tue Feb 08 12:30:27+0000 2011”。索引0,这是第一个空格所在的位置,因此它已经有点帮助了

我建议删除这些空格:

    dateq = dateq.trim();
这将适用于所有空白字符,而不仅仅是空格字符,如果有0、1、2或多个空白字符,也可以使用。将这一行插入到正确的位置,我们得到
java.time.format.DateTimeParseException:无法在索引0处解析文本“Tue Feb 08 12:30:27+0000 2011”。这几乎是相同的信息!这一次,我们在字符串的开头没有看到空格,但它仍然表示问题出在索引0处。现在这里写的是“星期二”。这条消息又说到点子上了,因为“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。詹夫。23 24:00:00+0000 2011
周二2011年2月8日12:30:27+0000

我想您应该看看文档:。即使日期是3个字母(星期二,二月),在规范中一个字母就足够了。所以应该是“em dd HH:mm:ss z yyyy”,在您现在删除的问题()中,您已经有了很多解释:前导空格、错误的区域设置、过时的DateFormat类,但您都忽略了它们。您还有一个问题:您希望得到哪个int值?但你也忽略了它。我们为什么要关心这个新问题?@bracco23我会试试你的建议,谢谢。@celia,因为输入文本有前导和尾随空格。查看
ParseException
文本。空格是清晰可见的。你能再给我一点解释吗。@celia除了的javadoc之外,你还需要什么解释?虽然通常我想让格式按原样处理字符串,但在这种特殊情况下,我想我更愿意将
dateq.trim()
传递给
parse()
在解析之前去掉前导空格和尾随空格。无论是否有空格,以及是否有1、2或多个空格,这都会起作用。@OleV.V。我同意。我已经把你的建议和我的答案结合起来了
    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);
    }