我有一个数据列表(USAGE_LIST),其中包含一些字段年份和月份以及使用情况,我想获得使用字段最近3个月的平均值, 我用SimpleDateFormat和getTime()尝试了类似Calendar.getInstance()的东西。 但是因为我没有真正的约会,它做得很好,最好的方法是做什么,请一个例子。谢谢,感谢StackoverFlow
<USAGE_LIST>
<TOTAL>
<YEAR>2013</YEAR>
<MONTH>10</MONTH>
<USAGE>200</USAGE>
</TOTAL>
<TOTAL>
<YEAR>2013</YEAR>
<MONTH>11</MONTH>
<USAGE>250</USAGE>
</TOTAL>
<TOTAL>
<YEAR>2013</YEAR>
<MONTH>12</MONTH>
<USAGE>500</USAGE>
</TOTAL>
<TOTAL>
<YEAR>2014</YEAR>
<MONTH>1</MONTH>
<USAGE>300</USAGE>
</TOTAL>
</USAGE_LIST>
答案 0 :(得分:0)
您仍然可以使用年和月构建Calendar
个实例,尝试以下内容:
Calendar calendar = Calendar.getInstance(); //Get a new calendar instance
calendar.clear(); // Clear it
calendar.set(Calendar.MONTH, month); // Set the new month and year
calendar.set(Calendar.YEAR, year);
Date date = calendar.getTime(); //Get you date value
答案 1 :(得分:0)
您可以使用日历:
Calendar c = new GregorianCalendar(year, month, dayOfMonth);
答案 2 :(得分:0)
创建一个日历实例,Calendar.getInstance()
和Calendar.set
到所需日期。您可以使用Calendar.Year
和Calendar.Month
作为参数进行设置。
让我们假设你已经将xml文件读入String[]
,其中每一行都是数组中的一个元素。只需迭代数组,检查年份和月份,当它们是正确的集合时,再次迭代并解析使用情况。重复3次并计算平均值。
答案 3 :(得分:0)
我为你写了完整的工作范例。它包含XML读取,过滤旧日期和平均使用计数。我使用xpath从XML文件中检索元素。
请注意,您提供的使用列表仅包含超过3个月的日期。因此,要使其工作(并输出除0之外的其他内容),您需要添加/修改它以获得更新的日期。
只需复制并设置此示例,并将使用列表xml文件添加到同一源文件夹。
package com.test;
import java.io.IOException;
import java.util.Calendar;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class AverageUsage {
public static void main(String[] args) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
Document doc = null;
int usageSum = 0;
int usageCount = 0;
// Create calendar representing now (used later)
Calendar threeMonthsBefore = Calendar.getInstance();
// Subtract 3 months from now
threeMonthsBefore.add(Calendar.MONTH, -3);
try {
builder = factory.newDocumentBuilder();
doc = builder.parse("src/data.xml");
// Create XPathFactory object
XPathFactory xpathFactory = XPathFactory.newInstance();
// Create XPath object
XPath xpath = xpathFactory.newXPath();
// Create xpath expression to query our totals
XPathExpression expr = xpath.compile("/USAGE_LIST/TOTAL");
// Evaluate expression result on XML document
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
// Iterate over all TOTAL elements
for(int i = 0; i < nodes.getLength(); i++){
// Current total element
Element total = (Element)nodes.item(i);
// Get YEAR, MONTH, USAGE elements from current TOTAL element
Element year = (Element)total.getElementsByTagName("YEAR").item(0);
Element month = (Element)total.getElementsByTagName("MONTH").item(0);
Element usage = (Element)total.getElementsByTagName("USAGE").item(0);
// Read values as int
int yearValue = Integer.valueOf(year.getTextContent());
int monthValue = Integer.valueOf(month.getTextContent());
int usageValue = Integer.valueOf(usage.getTextContent());
// Get calendar instance & reset it
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0); // ! clear would not reset the hour of day !
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
cal.clear(Calendar.DATE);
// Set calendar date
cal.set(Calendar.YEAR, yearValue);
cal.set(Calendar.MONTH, monthValue);
// Check if cal date is less than 3 months old
if(cal.after(threeMonthsBefore)){
usageSum += usageValue;
usageCount++;
}
}
if(usageCount > 0){
float average = usageSum / (float) usageCount;
System.out.println("Average usage in past 3 months is: " + average);
}else{
System.out.println("There were no usage in past 3 months.");
}
} catch (ParserConfigurationException | SAXException | IOException
| XPathExpressionException e) {
e.printStackTrace();
}
}
}
答案 4 :(得分:0)
我不太确定你的意思是&#34;过去三个月&#34;,但让我们假设你的意思是&#34;所有TOTAL元素的平均USAGE,其年份/ MONTH是在今天之前的三个月之内&#34;。
具体取决于您希望日期算术如何工作,在XPath 2.0或XQuery 3.0中可以表示类似
avg(/USAGE_LIST/TOTAL[(current-date() - xs:date(concat(YEAR, '-', MONTH, '-01')
gt xs:dayTimeDuration('P90D')])
当然,您可以从Java调用许多XPath 2.0和/或XQuery 1.0库;撒克逊人就是其中之一。
上述表达式的确切含义是获取过去90天内每月1日发生的所有月份的平均值。如果你想更准确地说明你的意图是什么,我确信XPath 2.0足以反映它。