Java 如何解决将字符串日期从xml文件转换为int格式的错误?
今天,我还发现自己面临着日期问题,我以字符串格式从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 :" +
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);
}