본문 바로가기

Swift

[Swift] Date() 날짜구하기, DateFormatter() 다루기 오전, 오후 등등

안녕하세요. 

오늘은 날짜와 관련된 코드에 대해 포스팅하도록 하겠습니다.

 

 

예를 들어 "2020-08-13 16:30" String을 Date 형태로 변환하여 날짜 계산을 한다던지,

"2020-08-13 16:30" String을 "2020.08.13 오후 4시 30분" 형태로 변환한다던지,

현재의 시간과 날짜를 구하던지,

아무튼 시작해 보겠습니다.

 

dateformat은 맨 아래에 테이블로 작성하도록 하겠습니다.

 

우선은 소스코드 먼저 공개하고 설명하도록 하겠습니다.

let dateStr = "2020-08-13 16:30" // Date 형태의 String
let nowDate = Date() // 현재의 Date (ex: 2020-08-13 09:14:48 +0000)

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" // 2020-08-13 16:30
        
let convertDate = dateFormatter.date(from: dateStr) // Date 타입으로 변환
        
let myDateFormatter = DateFormatter()
myDateFormatter.dateFormat = "yyyy.MM.dd a hh시 mm분" // 2020.08.13 오후 04시 30분
myDateFormatter.locale = Locale(identifier:"ko_KR") // PM, AM을 언어에 맞게 setting (ex: PM -> 오후)
let convertStr = myDateFormatter.string(from: convertDate!) 
let convertNowStr = myDateFormatter.string(from: nowDate) // 현재 시간의 Date를 format에 맞춰 string으로 반환

1. 현재의 Date를 원하는 Format으로 변환하고자 할 때

Date()를 선언하면 현재의 Date를 얻을 수 있다.

이때 얻은 Date는 "2020-08-13 09:14:48 +0000" 이러한 형태로 넘어온다.

 

"2020"08-13 09:14"의 형태로 바꾸고자 한다면 DateFormatter dateFormat이라는 함수를 이용하면 됩니다.

타입이 String이니 String을 넣어줍시다.

"yyyy-MM-dd HH:mm" (ex: 2020-08-13 09:14)

 

yyyy: 년도 (ex: 2020)                                                

MM: 월 (ex: 08)                                                         

dd: 일 (ex: 13)                                                            

HH: 시간 (ex: 16 [24시간])                                         

hh: 시간 (ex: 04 [12시간])                                          

a: (ex: AM, PM Locale에 따라 오전, 오후로 표기 가능)

 

우선 자주 사용하는 형태만 먼저 작성하고 더 많은 형태는 아래에 정리하도록 하겠습니다.

dateFormat에 format에 해당하는 String값을 제외하고는 일반 String으로 표기됩니다.

예를 들면 2020년이라고 표기하고 싶으면

dateFormatter.dateFormat = "yyyy년" // "2020년"

이런 식으로 작성을 하는 겁니다.

간단하죠??

 

이제 format을 맞춰줬으니 Date를 포맷에 맞게 추출해 봅시다.

우선 방법은 간단합니다.

dateFormat을 선언한 DateFormatter()를 사용해야겠죠??

DateFormatter의 클래스 안에는 string을 뽑아내는 함수가 있습니다.

 

작명이 참 알아보기 쉽게 되어있죠??

string(from date: Date) 함수는 Date타입을 String으로 반환시켜주고,                  

date(from string: String) 함수는 String으로 들어온 것을 Date?로 반환시켜줍니다.

Date에는 ?(물음표)가 있는 것으로 보아 Stringformat이 안 맞으면 nil값으로 반환해준다는 것이겠죠

 

사용방법은 간단합니다.

let str = dateFormatter.string(from: date!)
print(str) // 2020-08-13 16:30

어떤가요?? 참 간단하죠??

 

풀 소스입니다.

let nowDate = Date() // 현재의 Date (ex: 2020-08-13 09:14:48 +0000)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" // 2020-08-13 16:30
let str = dateFormatter.string(from: nowDate) // 현재 시간의 Date를 format에 맞춰 string으로 반환

 

 

2. String 타입으로 된 Date를 내가 원하는 형태로 변경하고자 할 때

1. String이 어떤 format으로 되어있는지 확인한다.

2. StringDate로 변환한다.                                

3. Date를 내가 원하는 format으로 변경한다.         

       

예를 들어서

"2020-08-13 13:30"인 String을 "2020년 08월 13일 오후 1시 30분" 형태로 변경해보겠습니다.

 

우선 첫 번째 "2020-08-13 13:30"의 형태는 "yyyy-MM-dd HH:mm"입니다.

시간에서 HH(24)hh(12) 잘 확인하시기 바랍니다.

 

두 번째  Date로 변환해줍니다. 

설명은 생략하겠습니다.

 

세 번째 "2020년 08월 13일 오후 1시 30분" 형태를 만들어 보면

"yyyy년 MM월 dd일 a hh시 mm분"이 됩니다.

여기서 (오전/오후)를 한글로 나타내려면 Locale을 한국으로 설정하시면 되고,

(AM, PM)으로 나타내고 싶다 하시면 Locale설정을 안 하셔도 됩니다.

 

소스를 바로 작성해 보도록 하겠습니다.

let dateStr = "2020-08-13 16:30" // Date 형태의 String
        
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" // 2020-08-13 16:30
        
let convertDate = dateFormatter.date(from: dateStr) // Date 타입으로 변환
        
let myDateFormatter = DateFormatter()
myDateFormatter.dateFormat = "yyyy년 MM월 dd일 a hh시 mm분" // 2020년 08월 13일 오후 04시 30분
myDateFormatter.locale = Locale(identifier:"ko_KR") // PM, AM을 언어에 맞게 setting (ex: PM -> 오후)
let convertStr = myDateFormatter.string(from: convertDate!)

만약 08월, 04시 이 부분에서 앞에 0을 빼고 싶으시면 dateFormat에서 M을 하나 빼주시면 됩니다.

"MM월" -> 08월

                                                                              "M월"     ->    8월

"HH시"   ->  04시

                                                                              "H시"     ->    4시

 

이해가 되셨나요??

이 정도면 웬만한 건 다 응용이 가능할 겁니다.

아래에 DateFomat 정리하고 마무리하도록 하겠습니다.

감사합니다

 

Format 설명 Example
"y" (년도) year의 약자로 년도를 나타낸다. (최소 1자) 1        ->    "1"
150    ->    "150"
2020 ->    "2020"
"yy" 년도의 뒤 두자리수만 나타낸다. (최소 2자) 1         ->  "01"
150     ->  "50"

2020  ->  "20"
2050  ->  "50"
"yyy" 년도의 세자리를 나타낸다. (최소 3자) 5         ->  "005"
25       ->  "025"
2020  ->  "2020"
"yyyy" 년도의 네자리를 나타낸다. (최소 4자) 5         ->  "0005"
350     ->  "0350"
2020  ->  "2020"
"M" (월) Month의 약자로 월을 나타낸다. (한자리) 7         ->  "7" 
11        ->  "11"     
"MM" 월의 두자리를 나타낸다. 7         -> "07"
11        -> "11"
"MMM" 세자리의 약어로 표현 (Locale에 따라 다름) Locale - ko_KR
7         -> "7월"   
11        ->  "11월" 

default
7          -> "Jul"
11         -> "Nov"
"MMMM" 월을 전체적으로 표현 Locale - ko_KR
7         -> "7월"   
11        ->  "11월" 

default
7          -> "July"
11         -> "
November"
"d"  (일) day의 약자로 일을 구함 5         ->  "5"
15        ->  "15"
"dd" 일을 두자리로 구함 5          ->  "05"
15         ->  "15"
"E", "EE", "EEE"  (요일) 요일을 약어로 나타냄 (Locale에 따라 다름) Locale - ko_KR
금요일   -> "금"   

default
금요일   -> "Fri"
"EEEE" 요일을 전체적으로 표현 Locale - ko_KR
금요일   -> "금요일"   

default
금요일   -> "Friday"
"EEEEE"  요일을 한글자로 표현 Locale - ko_KR
금요일   -> "금"   

default
금요일   -> "F"
"EEEEEE" 요일을 두글자로 표현 Locale - ko_KR
금요일   -> "금"   

default
금요일   -> "Fr"
"a"  (오전, 오후) 오전, 오후를 나타냄 (Locale에 따라 다름) Locale - ko_KR
오전      -> "오전"   
오후      ->  "오후" 

default
오전      -> "AM"
오후      -> "
PM"
"h"  (시간) 시간을 12시간으로 표현( 한자리) 3          ->  "3"
11         ->  "11"
23        ->  "11"
"hh" 시간을 12시간으로 표현 (두자리) 3          ->  "03"
11         ->  "11"
23        ->  "11" 
"H" 시간을 24시간으로 표현 (한자리) 3          ->  "3"
11         ->  "11"
23        ->  "23"
"HH" 시간을 24시간으로 표현 (두자리) 3          ->  "03"
11         ->  "11"
23        ->  "23"
 
"m"  (분) 분을 표현 (한자리) 3          ->  "3"
45        ->  "45"
"mm" 분을 표현 (두자리) 3          ->  "03"
45        ->  "45"
"s" (소문자)  (초) 초를 표현 (한자리) 3          ->  "3"
45        ->  "45"
"ss" 초를 표현 (두자리) 3          ->  "03"
45        ->  "45"
"S" (대문자)  (밀리초) 밀리초 표현 (한자리) 0.12     ->  "0.1"
0.713   ->  "0.7"
"SS" 밀리초 표현 (두자리) 0.12     ->  "0.12"
0.713   ->  "0.71"
"SSS" 밀리초 표현 (세자리) 0.12     ->  "0.120"
0.713   ->  "0.713"

 

감사합니다.

반응형