Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 29 30 31
Archives
Today
Total
관리 메뉴

원블루의 블로그

[Swift] 다국적 사용자 대응 DateFormatter 불기력 서기력(그레고리) 변환 정리 본문

iOS 개발

[Swift] 다국적 사용자 대응 DateFormatter 불기력 서기력(그레고리) 변환 정리

원블루:) 2024. 7. 5. 19:02

불기력 서기력 변환 구현

예시로 태국 시간을 나타내는 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

 

코드를 실행해보면

  1. 2567-07-05 19:00:00
  2. 2024-07-05 12:00:00 +0000
  3. 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를 설정하는 것이 좋다고 생각된다.