앱을 개발하다 보면 흔지 Date 를 String(년,월,일,오전,오후,시간) 이런식으로 나타내야 할 때가 있다.
클라이언트와 서버와의 통신중 날짜 관련 포맷은 대부분 "2019-03-23T06:29:04.000Z" 이런 식의 포맷을 사용 할 것이다.
우리는 그럼 저 부분을 DateFormatter를 이용해서 date로 바꾸고 또는 년,월,일,오전,오후,시간 이런 식으로 나타낼 것이다.
그리고 UTC 기반이기 때문에 현재 Locale 과 TimeZone에 따라 그 나라에 맞게 아니면 절대적인 값을 표현할 것이다.
Locale(로케일)은 세계 여러 나라들은 각자 다른 문화(언어, 날짜, 시간 등)을 갖고 있다. 프로그램의 국제화(Internationalization, 줄여서 i18n)는 사용자로 하여금 프로그램 수행시 로케일이란 것에 의해 입맛에 맞는 환경을 선택할 수 있도록 만든 것을 말한다.
TimeZone(시간대)은 영국의 그리니치 천문대를 기준으로 지역에 따른 시간의 차이이다.
지구의 자전에 따른 지역 사이에 생기는 낮과 밤의 차이를 인위적으로 조정하기 위해 고안된 시간의 구분선을 일컫는다.
시간대는 UTC를 기준으로한 상대적인 차이로 나타낸다.
그렇다 UTC 이게 절대값인데 우리는 이 기준으로 한국 시간을 나타낼수 있다. 한국은 UTC 기준 +9 이다.
UTC 시간에 +9를 해주어 나타내주면 한국 시간으로 나타낼 수 있다.
예제를 보자.
["startDate" : "2019-03-23T06:29:04.000Z"]
이런식의 데이터를 서버에서 받았다고 치자.
extension String {
var stringToDate:Date {
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
return dateFormatter.date(from: self)!
}
}
let startDate = "2019-03-23T06:29:04.000Z"
let stringToDate = startDate.stringToDate
print(stringToDate) //2019-03-23 06:29:04 +0000
우리는 저 스트링으로 된 날짜를 Date 형식으로 바꿀때 저렇게 사용할 수 있다.
우리는 저 Date로 변한 변수를 가지고 이제 우리가 Locale, TimeZone을 이용해서 변환을 해볼 것이다.
func dateToStringWithFormat(date: Date, format: String, locale : Locale, timeZone : TimeZone) -> String {
let dateFormatter = DateFormatter()
dateFormatter.locale = locale //특정 언어를 나타내는
dateFormatter.timeZone = timeZone
dateFormatter.dateFormat = format
return dateFormatter.string(from: date)
}
let koreaLocaleKoreaTimeZone = dateToStringWithFormat(date: startISOdate, format: "YYYY-M(MMM)-dd EEEE (a) hh:mm", locale: Locale(identifier: "ko_KR"), timeZone:TimeZone(abbreviation: "KST")! )
print("로케일 : 한국 , 타임존 : 한국 " + koreaLocaleKoreaTimeZone)
//로케일 : 한국 , 타임존 : 한국 2019-3(3월)-23 토요일 (오후) 03:29
let koreaLocaleUTCTimeZone = dateToStringWithFormat(date: startISOdate, format: "YYYY-M(MMM)-dd EEEE (a) hh:mm", locale: Locale(identifier: "ko_KR"), timeZone:TimeZone(abbreviation: "UTC")! )
print("로케일 : 한국 , 타임존 : UTC " + koreaLocaleUTCTimeZone)
//로케일 : 한국 , 타임존 : UTC 2019-3(3월)-23 토요일 (오전) 06:29
let usLocaleKoreaTimeZone = dateToStringWithFormat(date: startISOdate, format: "YYYY-M(MMM)-dd EEEE (a) hh:mm", locale: Locale(identifier: "en_US_POSIX"), timeZone:TimeZone(abbreviation: "KST")! )
print("로케일 : US , 타임존 : 한국 " + usLocaleKoreaTimeZone)
//로케일 : US , 타임존 : 한국 2019-3(Mar)-23 Saturday (PM) 03:29
let usLocaleUTCTimeZone = dateToStringWithFormat(date: startISOdate, format: "YYYY-M(MMM)-dd EEEE (a) hh:mm", locale: Locale(identifier: "en_US_POSIX"), timeZone:TimeZone(abbreviation: "UTC")! )
print("로케일 : US , 타임존 : UTC " + usLocaleUTCTimeZone)
//로케일 : US , 타임존 : UTC 2019-3(Mar)-23 Saturday (AM) 06:29
playground에서 위에 아래 같이 사용하면 된다.
우리가 볼 것은 M(MMM) EEEE (a) hh 가 어떻게 나왔는지 보면 될 것이다.
Locale에 따라서 (월, 토요일, 오전, 오후) 또는 (Mar, Saturday, AM, PM) 이 달라지는 것을 볼 수 있고
TImeZone에 따라서 오전, 오후, 03, 06 이런 식으로 +9 된 시간과 UTC 절대 시간이 달라지게 나오는 것을 확인 할 수 있다.
Locale identifiers 정보
https://popopo.tistory.com/156
TimeZone abbreviation 정보
https://www.timeanddate.com/time/zones/
'개발 블로그 > 아이폰개발' 카테고리의 다른 글
[iOS GCD(Grand Central Dispatch)] 소개 및 멀티스레드 프로그래밍 (0) | 2019.12.19 |
---|---|
[iOS 앱 내 구입] iOS 앱 내 결제 시스템 구현편 (0) | 2019.12.13 |
[iOS 앱 내 구입] iOS 앱 내 결제 시스템을 구현하면서 필수 고려할 사항 정리 (2) | 2019.12.04 |
[iOS] App Lifecycle( 앱 생명주기) (0) | 2019.11.27 |
[iOS DateFormatter Locale] Date->String Locale identifier 사용표 (0) | 2019.11.21 |
[Swift Date] 예약과 유저에게 보여줘야 할 DateFormatter TimeZone 설정 (0) | 2019.11.20 |
[Objectvie-c 의 블록] objectvie c 블록[block] 2장 메모리 영역 (0) | 2019.11.08 |
[Objectvie-c 의 블록] objectvie c 블록[block] 1장. (0) | 2019.11.08 |
frame 과 bounds 차이라면..? Swift, Xcode, iOS 개발 (0) | 2019.10.30 |
델리게이트(Delegate) 위임 패턴이란? (0) | 2019.10.23 |
댓글