티스토리 뷰

연말에 전혀 예상하지 못한 오류가 보고되었다.

유저는 분명 2023년 12월 31일을 선택했는데, 2024년 12월 31일 로 나오는 이슈가 있었다.

 

시간이 바뀌거나 하루 단위면 UTC 관련 이겠구나 싶었는데,

다른 날짜들은 모두 정상이였고,

연도가 바뀌는 현상은? 아무런 생각도 들지 않고 감도 못잡았다.

 

결론부터 말하자면, 간단한 오타에 의한 이슈였다.

 

DateFormatter

DateFormatter는 서비스 영역에서 너무나 자주 만나게되는 고마운 녀석이다.

"yyyyMMddHHmmss" 형식을 관례적으로 늘 자주 사용하다보니 dateFormat 이 문제일줄은 몰랐다.

 

눈을 씻고 기존에 (누군가) 작성해둔 코드를 찾아보니 yyyy가 소문자가 아닌 대문자 YYYY 로 되어 있었고,

여기서, yyyy 와 YYYY 는 다르다는 사실을 처음 알았다!

 

yyyy: 일반적인 우리가 늘 생각하는 연도

YYYY: 주 기반 연도(?)

 

주 기반 연도란

해당 주가 속한 연도를 출력한다.

2023년 12월의 달력을 보자

 

문제의 그날을 보자

 

23년 12월 31일이 속한 날은 일요일이며, 월요일에 2024년이 시작된다.

 

주 기반 연도는 해당 주가 다음 연도에 하루라도 걸쳐있으면 다음연도로 친다.

31일이 속한 1월 첫주가 2024년이기 때문에 2024년으로 출력한것이다.

 

간단한 예제 코드로 만들어보았다.

func getDateFromString(_ dateString: String) -> Date {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyyMMdd"
    return dateFormatter.date(from: dateString)!
}

func getStringFromDate(date: Date, format: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = format
    return dateFormatter.string(from: date)
}

let date = getDateFromString("20231231")
let 그날짜 = getStringFromDate(date: date, format: "YYYY년 MM월 dd일")
print(그날짜)

 

 

20231231 의 날짜값을 넣은 뒤 YYYY년 MM월 dd일 로 출력을 하게 하면 

[ 2024년 12월 31일 ] 이 출력된다.

 

YYYY년 MM월 dd일: 2024년 12월 31일

yyyy년 MM월 dd일: 2023년 12월 31일

 

이 현상은 2024년, 2025년 도 마찬가지이다..

 

2027년 12월 31일은 금요일이다. 토요일 단 하루만이 2028년에 속한다.

하지만 주 기반 연도는 이 상황에서도

2027년 12월

let date = getDateFromString("20271231")
let 그날짜 = getStringFromDate(date: date, format: "YYYY년 MM월 dd일")

print(그날짜)
// 출력: 2028년 12월 31일

 

무려 2028년을 내뱉는다.

 

이렇게 주 기반 연도에 대해 알아보았지만, 아무리 생각해도 어디에 쓰는건지는 잘 모르겠다.

이렇게 알아보았으니 앞으로 틀리는 일은 없을것같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함