얼쑤의 성장 화면에는 선택한 기간을 이전 기간과 비교한 수치와 현재 연속 연습일이 함께 나옵니다. 두 숫자 모두 날짜로 계산하지만 기준이 다릅니다. 비교 기간은 사용자가 고른 구간에 따라 바뀝니다. 연속 연습일은 과거 달을 보고 있어도 오늘을 기준으로 유지하기로 했습니다.
초안에서는 서버가 주간·월간 구간을 정하려고 했습니다. 팀의 API 계약을 대조한 뒤 화면에서 고른 시작일과 종료일을 앱이 보내고, 서버가 그 범위의 요약과 날짜별 집계를 반환하도록 맞췄습니다. 인정 시간 1분 이상을 연습한 날로 보는 규칙도 합의를 거쳐 계약에 반영했습니다. 이때 정한 시작일·종료일 계약을 기준으로 비교 기간과 연속 일수의 계산을 나눴습니다.
월 전체는 지난달과 비교
3월 전체에서 단순히 앞의 31일을 구하면 평년에는 1월 29일부터 2월 28일까지입니다. 화면에서 지난달이라고 부르는 기간은 2월 1일부터 28일까지여야 합니다. 그래서 시작일이 1일이고 종료일이 그 달의 말일이면 이전 달 전체를 비교 대상으로 골랐습니다. 그 밖의 주간 보기나 임의 구간에는 바로 앞에서 같은 일수만큼 가져왔습니다. 예를 들어 3월 2일부터 31일까지의 30일은 직전 30일인 1월 31일부터 3월 1일까지와 비교합니다.
두 규칙의 경계를 단위 테스트에 넣었습니다. 평년의 2월은 28일, 윤년의 2월은 29일까지였고, 1월의 이전 달은 전년도 12월이었습니다. 같은 달이라도 시작일이나 종료일이 달 전체에서 하루 벗어나면 같은 일수 규칙으로 계산됐습니다.
오늘이 1분 미만이면 어제부터
한국 시간으로 날짜별 인정 시간이 60초 이상이면 그날을 연습한 날로 봅니다. 오늘이 그 기준을 충족했으면 오늘부터, 아직 충족하지 않았으면 어제부터 날짜를 거슬러 셉니다. 중간에 기준을 충족하지 못한 날을 만나면 멈춥니다. 아침에 앱을 열었다는 이유로 어제까지 이어진 기록이 바로 0이 되지 않게 한 선택입니다.
테스트 시계를 한국 시간 00시 30분에 고정했습니다. UTC 날짜는 아직 전날인 시각입니다. 어제부터 3일 연속으로 기준을 채우고 그 앞날에는 59초만 기록했더니 연속 일수는 3일이었습니다. 통계 범위를 지난달로 지정한 이 테스트에서도 연속 일수는 3일이었습니다. 달력을 비교하는 날짜와 연속 일수를 시작하는 날짜를 따로 정했기 때문에, 같은 화면에서도 각 수치가 가리키는 기간을 명확히 설명할 수 있었습니다.

댓글
댓글과 반응은 GitHub 계정으로 로그인해 남길 수 있어요.