Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 如何知道时间戳何时更改?_Java_Logic - Fatal编程技术网

Java 如何知道时间戳何时更改?

Java 如何知道时间戳何时更改?,java,logic,Java,Logic,我有这个类日志: private Integer id; private Timestamp time; private String value; 我希望生成关于以下时间间隔的平均值的报告:秒、分钟、小时、天、月、年。 例如,我在列表日志中有这些值: 代码: 输出: INFO: 2012-04-26 20:06:21.0 10.0, INFO: 2012-04-27 09:09:32.0 10.0, INFO: 2012-04-27 09:31:09.0 15.0, INFO: 2

我有这个类
日志

private Integer id;

private Timestamp time;

private String value;
我希望生成关于以下时间间隔的平均值的报告:
秒、分钟、小时、天、月、年
。 例如,我在
列表日志中有这些值:

代码:

输出:

INFO: 2012-04-26 20:06:21.0 10.0, 
INFO: 2012-04-27 09:09:32.0 10.0, 
INFO: 2012-04-27 09:31:09.0 15.0, 
INFO: 2012-04-27 09:31:23.0 27.0, 
INFO: 2012-04-27 09:31:42.0 30.0, 
INFO: 2012-04-27 09:31:54.0 47.0, 
INFO: 2012-04-27 12:19:00.0 80.0, 
我想取
分钟内的平均值,那么结果应该是:

10 / 1 = 10, 
10 / 1 = 10, 
15 + 27 + 30 + 47 = 119/4 = 29.75
80 / 1 = 80

你们知道我该怎么做吗?

好的,像这样的事情怎么样(尽管当我看到你们还在挣扎时,我很快就把它拼凑了起来——使用地图来计数并不明智):

将日志更改为:

Integer id;
DateTime time;
String value;

public Log(Integer id, Timestamp time, String value) {
    this.id = id;
    this.time = new DateTime(time.getTime());
    this.value = value;
}
然后:

//生成一些假日志
最终列表日志=新的ArrayList();
添加(新日志(1,新时间戳(new DateTime().withDate(2011,1,1).getMillis()),“90”));
添加(新日志(1,新时间戳(new DateTime().withDate(2010,1,1).withTimeAtStartOfDay().getMillis()),“60”);
添加(新日志(1,新时间戳(new DateTime().withDate(2010,1,1).withTimeAtStartOfDay().getMillis()),“80”);
添加(新日志(1,新时间戳(new DateTime().withDate(2009,1,1).getMillis()),“70”));
最终映射总数=新HashMap();
最终映射计数=新HashMap();
对于(日志l:日志){
//四舍五入到最近的一分钟
final DateTime t=l.getTime(),带secondofminute(0);
整数和=total.get(t);
sum=(sum==null)?0:sum;
total.put(t,sum+Integer.parseInt(l.getValue());
整数c=count.get(t);
c=(c==null)?0:c;
计数放(t,c+1);
}
对于(Map.Entry:total.entrySet()){
System.out.println(entry.getValue()/count.get(entry.getKey());
}

在这里,我假设您仍然希望在
Log
构造函数中使用
TimeStamp
,但不介意在内部将其存储为JodaTime
DateTime
对象。然后我们创建一些假日志。然后,我们循环遍历所有日志,并将计数和总数存储到最近的一分钟。实际上,我会创建一个对象来存储这些数据(包括总数和计数),然后使用
DateTime
作为键。我希望这是有意义的。

在每个日志项上循环,如果它具有相同的分钟值,则将其添加到地图内的运行总数中,还保留每分钟计数的单独列表。然后再次循环并打印总数/计数,我建议您使用JodaTime而不是(我假设是)java.sql。Timestamp@BeRecursive问题是,既然他们不同了,我又怎么能这样做呢?你能给我举个例子吗?你说它们不同是什么意思?当然,您只需在日志上循环,并在一个映射中求和,其中的关键是分钟我如何使用带有时间戳的JodaTime,正如您所建议的那样?
Integer id;
DateTime time;
String value;

public Log(Integer id, Timestamp time, String value) {
    this.id = id;
    this.time = new DateTime(time.getTime());
    this.value = value;
}
// Build some fake logs
final List<Log> logs = new ArrayList<Log>();
logs.add(new Log(1, new Timestamp(new DateTime().withDate(2011,1,1).getMillis()), "90"));
logs.add(new Log(1, new Timestamp(new DateTime().withDate(2010,1,1).withTimeAtStartOfDay().getMillis()), "60"));
logs.add(new Log(1, new Timestamp(new DateTime().withDate(2010,1,1).withTimeAtStartOfDay().getMillis()), "80"));
logs.add(new Log(1, new Timestamp(new DateTime().withDate(2009,1,1).getMillis()), "70"));
final Map<DateTime, Integer> total = new HashMap<DateTime, Integer>();
final Map<DateTime, Integer> count = new HashMap<DateTime, Integer>();

for(Log l : logs) {
    // Round down to the nearest minute
    final DateTime t = l.getTime().withSecondOfMinute(0);
    Integer sum = total.get(t);
    sum = (sum == null) ? 0 : sum;
    total.put(t, sum + Integer.parseInt(l.getValue()));

    Integer c = count.get(t);
    c = (c == null) ? 0 : c;
    count.put(t, c + 1);
}

for(Map.Entry<DateTime, Integer> entry : total.entrySet()) {
    System.out.println(entry.getValue() / count.get(entry.getKey()));
}