원블루의 블로그
[Swift] 다국적 사용자 대응 DateFormatter 불기력 서기력(그레고리) 변환 정리 본문
불기력 서기력 변환 구현
예시로 태국 시간을 나타내는 String "2567-07-05 19:00:00"을 DateFormatter를 이용하여 한국 시간 String 으로 변환해보자.
태국인은 기본적으로 불기력(Buddhist Calendar)을 사용한다.
명시적으로 Calendar 값을 설정하는 걸 보여주기 위해 Locale 설정은 사용 하지 않았다.
import Foundation
let thaiDate = "2567-07-05 19:00:00" //태국 형식의 불기력 날짜 샘플
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" //날짜 포맷
formatter.timeZone = TimeZone(abbreviation: "ICT") // 인도차이나 시간대
formatter.calendar = Calendar(identifier: .buddhist) // 불기력
let date = formatter.date(from: thaiDate)
print(date!) // 2024-07-05 12:00:00 +0000
formatter.timeZone = TimeZone(abbreviation: "KST") //한국 시간대
formatter.calendar = Calendar(identifier: .gregorian) //그레고리력
let string = formatter.string(from: date!)
print(string) // 2024-07-05 21:00:00
코드를 실행해보면
- 2567-07-05 19:00:00
- 2024-07-05 12:00:00 +0000
- 2024-07-05 21:00:00
위 순서대로 변환이 된다.
DateFormatter의 TimeZone과 Calendar 설정 값을 태국시간(String) 포맷에 맞게 설정하여 Date로 변환하고,
이 Date를 TimeZone과 Calendar 설정 값을 한국시간 포맷에 맞게 설정하여 한국시간(String) 으로 변환했다.
2번 "2024-07-05 12:00:00 +0000" 는 Date 객체에 저장된 협정세계시(UTC)이다.
Date 객체는 절대적인 시각인 협정세계시(UTC)를 저장한다. 쉽게 UTC의 기준인 영국 시간이라고 생각하면 된다.
태국시간은 UTC+7 타임존에 있어서, 태국시간이 오후 19:00 일 때 영국은 오후 12:00 이다.
또한, 불기력은 서기력보다 543년이 길어서 2567년은 2024년으로 변환되었다.
DateFormatter의 Locale, TimeZone, Calendar 설정 값을 시간대와 기년법에 맞게 바르게 설정하면 오류 없는 변환이 가능하다.
DateFormatter의 주요 설정값
- Locale: 언어와 지역 (예: "ko_KR", "en_US", "en_GB")
- TimeZone: 시간대 (예: "KST", "PST","PDT")
- Calendar: 달력형식(예: .gregorian(그레고리력), .buddhist(불기력))
주의: Locale, TimeZone, Calendar 설정에 따른 사이드이팩트
혹시 한 설정값을 바꾸면 다른 설정값에 영향을 미치지 않을까 하고 실험코드를 돌려봤다.
결과는 Locale 설정 값을 변경하면 Calendar가 그 지역의 보편적인 달력형식으로 변경된다.
예를 들어 Locale을 "th_TH"로 변경하면 Calendar 이 Buddhist Calendar로 변경되고,
Locale을 "ko_KR"로 변경하면 Calendar은 Gregorian Calendar로 자동 변경된다.
반면에 Locale 설정 값을 변경해도 TimeZone 설정 값은 변하지 않는다.
서두에서 말했듯이 이런 변환에서는 Locale보다는 명시적으로 Calendar, TimeZone를 설정하는 것이 좋다고 생각된다.