· 2 min readAndriod

Locale.getDefault이 일으킨 버그 해결하기(1)

#trouble-shooting#android#i8n

앱 기능에 주간 리더보드가 있는데... 1주가 계산되는 로직때문에 사소한 버그가 생겼다.

이번주는 아직 16시간이 남았는데 리더보드는 이미 다음 주로 넘어가 있다.

왜 그런지 살펴보자.

Locale.getDefault() 의 함정

Locale.getDefault()는 사용자가 스마트폰 설정에서 지정한 '지역' 정보를 가져온다. 이때 주의 시작을 언제로 할지가 결정되는데 getDefault의 경우 지역에 따라 일요일을 한 주의 시작으로 설정하는 경우가 있어서 발생하는 문제다.

주 계산 로직은 아래와 같다.

private fun getWeeklyPeriodId(): String {
    val today = LocalDate.now()
    val weekFields = WeekFields.of(Locale.getDefault())
    val weekNumber = today.get(weekFields.weekOfWeekBasedYear())
    return "weekly_${today.year}-W${String.format("%02d", weekNumber)}"
}

나는 서버 데이터를 Firestore로 사용하는데, Firestore와 연동할 날짜에 getDefault를 달아주면 조회하는 곳과 데이터가 생성되는 지역이 달라서 문제가 발생한다.

그래서 지역을 따로 설정하기 보다, ISO 표준 규격을 따르도록 하면 무조건 월요일을 한 주의 시작으로 잡아준다.

기준주의 시작2026-02-01 (일)의 위치리더보드 ID
WeekFields.ISO월요일지난 주의 마지막 날weekly_2026-W05
Locale.US / KR일요일새로운 주의 첫째 날weekly_2026-W06
private fun getWeeklyPeriodId(): String {
    val today = LocalDate.now()
    val weekFields = WeekFields.ISO
    val weekNumber = today.get(weekFields.weekOfWeekBasedYear())
    return "weekly_${today.year}-W${String.format("%02d", weekNumber)}"
}

today.get(weekFields.weekOfWeekBasedYear())에서 이미 주단위 연도계산으로 월요일을 시작으로 계산 중이었는데, weekField가 firestore 계산 방식과 어긋나서 발생한 문제다.

이게 ISO-8601 표준을 따르는데, 그해의 첫 번째 목요일을 포함하는 주를 1주 차로 정의하는 4-day rule이라고 한다.

Share:

Comments