背景
公司有需求,自己统计次日留存。但是发现,首日用户注册在早上6点,在早上8点以后就直接上报次日留存了。
代码
关键代码就是判断是否是昨天
//判断选择的日期是否是昨天
public static boolean isYesterday(long timeInMillis) {
Calendar cal = Calendar.getInstance();
long lt = timeInMillis / 86400000;
long ct = cal.getTimeInMillis() / 86400000;
if ((ct - lt) == 1) {
return true;
} else {
return false;
}
}
原因
System.currentTimeMillis()
获取的是格林尼治时间,北京的时区是+8,所以,对于计算机来说,早上8点才是它的24:00。
用户在早上6点注册,8点上报。相当于北京时间10点注册,第二天00:01上报。
所以,逻辑上找不到任何毛病。需要根据需求进行修改。
解决方法
- 使用北京时间,手动-8个小时(但是也还是有这个问题,跨越0点)
- 使用间隔差24小时,也就是说,安装24小时后留存,就不是次日留存了。
或者与产品经理沟通