【发布时间】:2018-02-08 12:09:09
【问题描述】:
我正在尝试计算出勤应用的持续时间列表的总和。我能够计算出 2 次的差异,但不知道如何遍历列表以将日期相加。
下面的代码是我到目前为止所尝试的。列表中有 2 个持续时间,它们是使用对象类从 Firebase 添加到列表中的。
持续时间 1 = 0:5:42
持续时间 2 = 0:0:09
预期总计 = 0:5:51
//初始化
long sum;
//当前尝试的方法
public void grandTotal() throws ParseException {
java.util.Date date1;
java.util.Date date2;
DateFormat formatter = new SimpleDateFormat("hh:mm:ss");
for(int i = 0 ; i < newList.size(); i++) {
String str_time1 = newList.get(i).getDuration();
date1 = formatter.parse(str_time1);
for (int j = 1; j < newList.size(); j++) {
String str_time2 = newList.get(j).getDuration();
date2 = formatter.parse(str_time2);
sum = date1.getTime() + date2.getTime();
}
}
secs = sum/1000;
mins = secs/60;
secs%=60;
hours = mins/60;
mins%=60;
txtDailyBalance.setText(hours+":"+mins+":"+String.format("%02d",secs));
}
我得到的结果输出是 = -1:59:42
我使用这种方法得到了解决方案,但我认为这不是一个好的做法,所以我一直在研究更多关于这篇文章中不同方法的信息,谢谢。
//Sum of time durations for that day
public void grandTotal() throws ParseException {
java.util.Date date1;
java.util.Date date2;
DateFormat formatter = new SimpleDateFormat("hh:mm:ss");
for(int i = 0 ; i < newList.size(); i++) {
timeDuration.add(newList.get(i).getDuration());
}
long tDur = 0;
for (String tmp : timeDuration){
String[] arr = tmp.split(":");
tDur += Integer.parseInt(arr[2]);
tDur += 60 * Integer.parseInt(arr[1]);
tDur += 3600 * Integer.parseInt(arr[0]);
}
long hours = tDur / 3600;
tDur %= 3600;
long mins = tDur / 60;
tDur %= 60;
long secs = tDur;
txtDailyBalance.setText(hours+":"+mins+":"+String.format("%02d",secs));
}
【问题讨论】:
-
考虑使用
java.time或ThreeTenABP处理日期。更简单、更连贯的代码,并且遇到此类错误的机会更少。 -
我建议这样做是因为您似乎在列表中有实际的持续时间,而您正试图将它们解析为日期。这已经大大影响了您答案的正确性。另一件事是您将列表中的所有内容与列表中的所有内容相加数次,对于大于 2 个元素的列表,这将使您获得更大的间隔。
-
Date是一个时间点,而不是一个持续时间。你在做什么,是错误的。对于持续时间,我推荐java.time.Duration(或者对于来自 ThreeTenABP 的旧版 Androidorg.threeten.bp.Duration)。它有一个plus的添加方法。 -
在任何情况下都考虑扔掉长期过时且臭名昭著的麻烦
SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。
标签: java android-studio time simpledateformat