场景
有这么个业务需求,要统计用户每天使用app的时长(后台运行也算)。
经过讨论决定把打开app、并且为登陆状态的时间作为开始时间;把关闭、崩溃、强杀进程或者登出的时间作为结束时间,由客户端统计,发送给服务端进行计算。
计算时间差的方式有很多,但找了半天没有合适这个场景的,于是就自己写了一下,如有其他方式欢迎留言。
code
public class Application {
private static final SimpleDateFormat simpleDateFormatLong = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static final SimpleDateFormat simpleDateFormatShort = new SimpleDateFormat("yyyy-MM-dd");
public static void main(String[] args) throws ParseException {
String fromStr = "2019-12-29 12:34:56";
String toStr = "2020-01-02 12:00:00";
System.out.println("开始时间:"+fromStr);
System.out.println("结束时间:"+toStr);
Date from = simpleDateFormatLong.parse(fromStr);
Date to = simpleDateFormatLong.parse(toStr);
if (from.compareTo(to) > 0) {
System.out.println("param error");
}
Map<String, Integer> result = calculateMinute(from, to);
for (Map.Entry<String, Integer> entry : result.entrySet()) {
System.out.println("日期:" + entry.getKey() + " 使用时长:" + entry.getValue() + "分钟");
}
}
private static Map<String, Integer> calculateMinute(Date from, Date to) {
Map<String, Integer> result = new LinkedHashMap<>();
Calendar comparisonValue = new GregorianCalendar();
comparisonValue.setTime(from);
comparisonValue.add(Calendar.DATE, 1);
comparisonValue.set(Calendar.HOUR_OF_DAY, 0);
comparisonValue.set(Calendar.MINUTE, 0);
comparisonValue.set(Calendar.SECOND, 0);
comparisonValue.set(Calendar.MILLISECOND, 0);
while (to.compareTo(comparisonValue.getTime()) > 0) {
long nextDayTime = comparisonValue.getTime().getTime();
long fromTime = from.getTime();
int nextDayMinutes = (int) ((nextDayTime - fromTime) / (1000 * 60));
result.put(simpleDateFormatShort.format(from), nextDayMinutes);
from = comparisonValue.getTime();
comparisonValue.add(Calendar.DATE, 1);
}
long fromNew = from.getTime();
long toNew = to.getTime();
int minutesNew = (int) ((toNew - fromNew) / (1000 * 60));
result.put(simpleDateFormatShort.format(from), minutesNew);
return result;
}
}
测试结果
开始时间:2019-12-29 12:34:56
结束时间:2020-01-02 12:00:00
日期:2019-12-29 使用时长:685分钟
日期:2019-12-30 使用时长:1440分钟
日期:2019-12-31 使用时长:1440分钟
日期:2020-01-01 使用时长:1440分钟
日期:2020-01-02 使用时长:720分钟