业务上需要开发一个获取连续签到(打卡)天数的功能,修修改改多次后发现了规律,可以减少代码量,使程序更简洁明了。
核心是getContinuousSignInDay方法的逻辑,每次用当前时间去比较,规律是比较的天数是递增的(连续签到的情况下)。
这份代码脱去了业务上的逻辑,只有签到的功能demo
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @Description TODO
* @Author fangyunhe
* @Date 2019/8/15 17:41
* Version 1.0
**/
public class SignInTest {
@Data
static
class SignIn{
private Date signInDay;
public SignIn(){
}
public SignIn(String day) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
signInDay = (day);
}
}
public static void main(String[] args) throws Exception{
List<SignIn> signInList = new ArrayList<>();
(new SignIn("2019-08-15"));
(new SignIn("2019-08-14"));
//(new SignIn("2019-08-13"));
(new SignIn("2019-08-12"));
(new SignIn("2019-08-11"));
int continuousSignInDay = getContinuousSignInDay(signInList);
("连续签到日期:"+ continuousSignInDay);
}
/**
* 连续签到天数
*
* @return int
* @Author fangyunhe
* @Date 2019-08-15 17:16:01
* @Param
**/
private static int getContinuousSignInDay(List<SignIn> signInList) {
//continuousDay 连续签到数
int continuousDay = 1;
boolean todaySignIn = false;
Date today = new Date();
for (int i = 0; i < (); i++) {
SignIn signIn = (i);
int intervalDay = distanceDay(today, ());
//当天签到
if (intervalDay == 0 && i == 0) {
todaySignIn = true;
}
else if (intervalDay == continuousDay) {
continuousDay++;
}else {
//不连续,终止判断
break;
}
}
if (!todaySignIn) {
continuousDay--;
}
return continuousDay;
}
/**
* 两个日期对比间隔天数
*
* @param smallDay
* @return boolean
* @Author fangyunhe
* @Date 2019-08-13 18:42:41
* @Param largeDay
**/
private static int distanceDay(Date largeDay, Date smallDay) {
int day = (int) ((() - ()) / (1000 * 60 * 60 * 24));
return day;
}
}