본문 바로가기
개발 블로그/아이폰개발

[swift Date, DateFormatter] Date->String , String->Date 일때 locale(identifier), TimeZone(abbreviation) 관계

by snapshot 2019. 11. 21.

앱을 개발하다 보면 흔지 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

 

[iOS DateFormatter Locale] Date->String Locale identifier 사용표

예) let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "ko_KR") 필드 심볼 ko-KR en_US_POSIX 내용 시대 (Era) G 서기 AD 기원전/후(서기) 표시 BC, AD GG 서기 AD GGG 서기 AD GG..

popopo.tistory.com

 

 

TimeZone abbreviation 정보

https://www.timeanddate.com/time/zones/

 

Time Zone Abbreviations - Worldwide List

EDT Eastern Daylight Time EDST – Eastern Daylight Savings TimeNAEDT – North American Eastern Daylight Time HAE – Heure Avancée de l'Est (French)EDT – Tiempo de verano del Este (Spanish) North AmericaCaribbean UTC -4

www.timeanddate.com

 

https://nsdateformatter.com/

불러오는 중입니다...

 

댓글