목차
티스토리 뷰
Date
를 사용하여 받아온 날짜 데이터를 원하는 형식으로 가공할때 DateFormat
을 사용합니다.
하지만 로케일, 타임존, 아이폰의 시스템 설정 유무 따라 날짜/시간에 대한 결과값이 달라지곤 합니다.
원하는 날짜 형식 표기를 위해 어떠한 것들을 이해하고 고려해야 할까요?
1. 로케일(Locale)
먼저 로케일(Locale)이란 아이폰에서 사용하는 언어, 지역, 출력 형식을 의미합니다.
아래 이미지와 같이 대한민국 로케일 설정시, 날짜 표기는 년-월-일을 순서대로 표기하고 시간 표기는 오전/오후로 구분한 12시간 형식을 사용하고 있는 것을 확인 할 수 있습니다.
하지만 이렇게 날짜나 시간을 표시할 때 각 나라마다 표시 형식이 다르다보니, ISO에서 정한 날짜/시간 표시 형식에 대한 표준 규격을 정하였고 그 규격을 ISO8601이라 합니다.
그리고 ISO8601을 인터넷상에서 사용하기 위해 제정한 규격을 RFC3339라고 합니다.
따라서 RFC3339는 그레고리안(세계협정시, UTC)를 사용하며, yyyy-MM-dd
, hh:mm:ss
와 같은 표기법들이 바로 이 규격에서 정의한 날짜와 시간에 대한 표기법입니다. [참고 링크]
2. 타임존(TimeZone)
한국의 타임존은 보통 GMT+09:00 으로 표현되는데, 이는 GMT를 기준으로 9시간 빠르다는 뜻 입니다.
GMT는 영국의 그리니치 천문대를 기준으로 하는 표준시 입니다.
GMT는 UTC라고도 불리어 두 용어가 혼용되어 사용되고 있는데, 시간적으로는 둘 사이에 소수점 단위의 아주 미세한 차이가 있습니다.
한국의 타임존을 KST라 하는데, 이는 결국 GMT+09:00에 대한 오프셋이라고 생각 할 수 있습니다.
다만, 해외에서는 DST(Daylight Saving Time)라는 서머타임 제도가 존재하여 하절기에 표준시를 원래 시간보다 한 시간 앞당긴 시간으로 이용합니다.
서머타임은 국가 정책에 의해 변경될 여지가 있으므로 서머타임제도가 있는 국가의 경우 UTC+N 시간이 이 국가의 특정 오프셋이라 가정하고 개발하는 것을 지양해야 합니다.
3. 아이폰 설정(캘린더, 시간)
아이폰의 시스템 설정 중 날짜/시간 형식에 영향을 미치는 요소는 아래와 같습니다.
3.1 캘린더 설정
아이폰의 캘린더 설정에는[양력, 일본력, 불교력]세 가지의 캘린더 타입이 존재합니다.
양력(UTC, 세계협정시)은 보편적으로 흔히 사용하지만 일본력과 불교력의 연호는 양력과 몇 백년씩 차이가 발생합니다.
3.2 시간 설정
아이폰의 시간 설정에는[12시간제, 24시간제]두 가지 타입이 존재합니다.
자동으로 설정 시 사용자에게 설정된 로케일을 따라갑니다.
4. 고정로케일(en_us_posix)
위에서 소개한 항목들을 고려하면서, 개발자가 앤드유저에게서 원하는 날짜 형식을 가져오는 것은 어려운 일입니다.
그럴때 사용하는 것이 바로 en_US_POSIX
입니다.
en_US_POSIX는 시스템 설정에 상관없이 미국/영어의 고정된 날짜/시간 표시 형식으로 결과를 가져오도록 설계된 로케일입니다.
[링크]를 보시면, 아래와 같은 글이 있습니다.
"en_US_POSIX" works the same on iOS as it does on OS X, and as it it does on other platforms
en_US_POSIX는 OS X에서와 마찬가지로 iOS에서도 동일하게 작동하며 다른 플랫폼에서도 작동합니다.
여기서 다른 플랫폼이란 유닉스/리눅스와 같은 POSIX 기반의 시스템을 의미합니다. 즉, 다른 운영체계와도 호환 가능한 로케일 문자열이라 볼 수 있습니다.
따라서 서버에 보내는 날짜/시간 값을 고정된 형식으로 보내야 하는 등의 요구가 있을 때에는
en_US_POSIX을 통해 24시간 형식, UTC에 기반한 고정된 날짜/시간 형식에 의한 결과값을 가져오는 것이 좋습니다.
저는 개인적으로 서버에 보낼 날짜/시간 데이터가 필요할 때 아래의 extension function을 이용합니다.
extension Date {
func toFormat(_ format: String, timeZone: TimeZone) -> String {
let datefomatter = DateFormatter()
datefomatter.locale = Locale(identifier: "en_US_POSIX")
datefomatter.dateFormat = format
datefomatter.timeZone = timeZone
let calendar = Calendar(identifier: .gregorian)
let components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: self)
let date = calendar.date(from: components) ?? Date()
return datefomatter.string(from: date)
}
}
DateFormat을 다루는 예제들 중 고정된 형식에 대한 결과값을 원할 때 en_US_POSIX를 사용하는 이유를 조금이나마 알게되었네요!
얄팍한 지식으로 정리하였으니 만약 틀린 부분이 있다면 알려주세요. 감사합니다 :)
5. 참고
- https://linuxism.ustd.ip.or.kr/909
- https://developer.apple.com/library/archive/qa/qa1480/_index.html
- https://developer.apple.com/documentation/foundation/dateformatter
'iOS > System' 카테고리의 다른 글
[iOS] Framework와 CPU Architecture에 대한 고찰 (0) | 2023.05.22 |
---|---|
[iOS] Firebase Distribution을 통한 앱 배포 (1) | 2023.05.17 |
[iOS] iOS앱에 Firebase 추가하기 (0) | 2023.04.28 |
[iOS] SwiftGen 적용하기 (0) | 2023.04.02 |
[iOS] Fastlane를 통한 iOS 앱 배포 자동화(AppStore, Firebase Distribution) (0) | 2023.04.02 |
- Total
- Today
- Yesterday
- swift google login
- iOS Nimble
- swift 구글 로그인
- iOS 유닛테스트
- swift google sdk
- nimble
- Framework
- iOS 테스트 코드
- iOS Framework
- swift framework
- Quick
- swift google login sdk
- XCFramework
- XCTest
- ios google signin
- ios google
- ios xcframework
- iOS Quick
- swift nimble
- swift reactorkit
- swift xctest
- iOS Unit Tes
- swift quick
- ios mvvm
- ios 구글 로그인 sdk
- swift google signin
- Firebase Distribution
- ios reactorkit
- iOS 단위테스트
- swift 구글 sdk
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |