Swift

Swift) Date, TimeInterval, DateFormatter,TimeZone,Calendar ,DateComponent - 시간, 날짜

행복하고 싶은 사람 2022. 10. 25. 17:38

시간, 날짜를 다루는 기능들은 Foundation을 import해야 사용할 수 있음.

 

⌛️ Date

Date캘린더나 표준 시간과는 무관한 특정 시간

 

Date값은 다른 특별한 캘린더 시스템이나 표준시와 독립적으로 특정 시간의 값을 캡슐화합니다. Date값은 절대 기준 날짜와 관련된 시간 간격을 나타냅니다.

Date structure는 date를 비교하고 두 date간 간격을 계산하고 다른 date로 부터 시간 간격을 가진 새 date를 만드는 메서드를 제공합니다.

날짜 값을 DateFormatter 인스턴스와 함께 사용하여 날짜 및 시간에 대한 지역화된 표현을 만들고 달력 인스턴스와 함께 사용하여 달력 계산을 수행합니다.

Date는 NSDate에 다리를 형성합니다. 우리는 Objective-C API와 interact하는 코드를 사용할 수 있습니다.

 

init()

- 현재 시각을 나타내줌

 

init(timeIntervalSinceNow: TimeInterval)

- 현재 시각으로 부터 입력한 초 이후의 시점을 나타냄

 

init(timeIntervalSince1970: TimeInterval)

- 1970년 1월 1일 00:00:00 UTC를 기준으로 주어진 초 단위로 초기화된 Date를 리턴

 

init(timeIntervalSinceReferenceDate: TimeInterval)
- 2001년 1월 1일 00:00:00 UTC를 기준으로 지정된 초 단위로 초기화된 날짜 값을 생성합니다.

 

// 1. 현재 시간
let date1 = Date()
// 2. 지금으로부터 300초 지난 시점
let date2 = Date(timeIntervalSinceNow: 300)
// 3. date2로부터 300초 지난 시점
let date3 = Date(timeInterval: 300, since: date2)
// 4. 유닉스 시간인 1970년 1월 1일 00:00:00 UTC로부터 300초 지난 시점
let date4 = Date(timeIntervalSince1970: 300)
// 5. 2001년 1월 1일 00:00:00 UTC로부터 300초 지난 시점
let date5 = Date(timeIntervalSinceReferenceDate: 300)

print(date1) // 2021-08-24 11:49:10 +0000
print(date2) // 2021-08-24 11:54:10 +0000
print(date3) // 2021-08-24 11:59:10 +0000
print(date4) // 1970-01-01 00:05:00 +0000
print(date5) // 2001-01-01 00:05:00 +0000

 

⌛️ TimeInterval

TimeInterval 타입은 날짜 및 시간 관련 표현에 사용하는 타입으로 초를 나타냅니다. 값이 1 == 1초!

그러나 사실 Double의 alias입니다. Type alias를 활용해 이름만 다르게 나타낸것. 

 

⌛️ DateFormatter

Date와 String 표현을 서로 변환해주는 역할을 수행. Date 타입을 텍스트로 표현하고 싶을때 주로 사용함. 

 

let date = Date()
let dateFormatter = DateFormatter() // 인스턴스 생성
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .medium

dateFormatter.locale = Locale(identifier: "en_US")
print(dateFormatter.string(from: date)) // Aug 24, 2021 at 8:55:52 PM

dateFormatter.locale = Locale(identifier: "fr_FR")
print(dateFormatter.string(from: date)) // 24 août 2021 à 20:55:52

dateFormatter.locale = Locale(identifier: "ko_KR")
print(dateFormatter.string(from: date)) // 2021. 8. 24. 오후 8:55:52

dateFormatter.dateFormat = "YY년 M월 d일 h시 mm분 ss초"
print(dateFormatter.string(from: date)) // 21년 8월 24일 8시 55분 52초

Date에서 String을 얻을 수 있는 것처럼 String에서 Date를 얻어오는 것도 가능함. 단 String이 DataFormatter 형식과 맞이 않은경우에는 nil이 리턴되어야 하므로 반환형이 Optional임.

 

// 인스턴스 생성
let formatter = DateFormatter()

// Date to String
let now = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy년 MM월 dd일 HH시 mm분 ss초"
let result = formatter.string(from: now)
print(result) // 2021년 08월 24일 20시 08분 32초


// String to Date
let dateString = "2021년08월24일 20시10분11초 +0000"
formatter.dateFormat = "yyyy년MM월dd일 HH시mm분ss초 ZZZZ"
let date = formatter.date(from: dateString)!
print(date) // 2021-08-24 20:10:11 +0000

 

 

⌛️ 포맷 용어 정리

Format Desctiption Example
y (년도) 연도 출력 2021
yy 연도 뒷자리 두개 출력 21
yyyy 연도 네자리 출력 M 월 출력 2021
M (월) 월에서 뒷자리 하나 (ex: 2) 8
MM 월을 두자리로 (ex: 02) 08
MMM 영문 약어로 (ex: feb, sept) Aug
MMMM 영문으로 (ex: february, september)
d 날짜 출력 h, H 시간 출력
August
d (일) 일 출력 25
dd 일을 두자리로 출력 25
E, EE, EEE (요일) 요일을 약어로 출력 (Locale에 따라 다름) Wed
EEEE 요일을 전체적으로 출력 Wednesday
EEEEE 요일을 한글자로 출력 W
EEEEEE 요일을 두글자로 출력 We
a (오전, 오후) 오전, 오후를 출력 (Locale에 따라 다름) PM or AM
h (시간) 시간을 12시간으로 한자리로 출력 2
hh 시간을 12시간으로 두자리로 출력 02
H 시간을 24시간으로 한자리로 출력 14
HH 시간을 24시간으로 두자리로 출력 14
m (분) 분을 한자리로 출력 5
mm 분을 두자리로 출력 05
s (초) 초를 한자리로 출력 1
ss 초를 두자리로 출력 11
S (밀리초) 밀리초를 한자리로 출력 0
SS 밀리초를 두자리로 출력 12
SSS 밀리초를 세자리로 출력 123
zzz (시간대) 타임존을 3글자로 출력한다. 이름을 모르는 경우 GMT-08:00으로 대체 GMT+9
zzzz 타임존의 이름을 상세하게 출력한다. Korean Standard Time
ZZZZ 타임존의 약어와 hour offset를 출력 GMT+09:00
Z RFC 822 GMT 포맷 방식 출력 +0900
ZZZZZ ISO 8601 타임존 포맷 방식 출력 +09:00

 

⌛️ TimeZone

특정 지정학적 지역과 관련된 표준 시간 규약에 대한 정보. 

쉽게 말하면 각 나라마다 시간대가 다르므로 그 시간대를 나타내기 위한 타입. 날짜 계산이나 날짜 표현 등의 작업을 수행할 때 TimeZone을 잘 확인해야함.

 

let date = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.locale = Locale(identifier: "ko_kr") // 한국의 시간을 지정해준다.
formatter.timeZone = TimeZone(abbreviation: "KST") // 한국의 시간대로 지정한다.
//formatter.timeZone = TimeZone.current // 현재 사용자의 시간대를 지정한다.

let kr = formatter.string(from: date) // Date to String
print(kr) // 2021-08-25 01:17:53

 

⌛️ Calendar

Calendar unit과 절대 지정 시점 간의 관계에 대한 정의로, 날짜를 계산하고 비교할 수 있는 기능을 제공.

즉 달력과 관련된 정보를 담는 구조체.

let date = Date()
var calendar = Calendar(identifier: .gregorian)
print(calendar.dateComponents([.day, .month], from: date)) // month: 8 day: 25 isLeapMonth: false

var dateComponents = DateComponents()
dateComponents.year = 1995
print(calendar.date(from: dateComponents)) // Optional(1994-12-31 15:00:00 +0000)

이외에도 AM/PM, WeekDay, Era등 다양한 Symbol을 얻을 수 있음

// Calendar로부터 날짜 요소별 Symbol 얻기
var calendar = Calendar(identifier: .gregorian)
calendar.locale = Locale(identifier: "ko_kr")
print(calendar.amSymbol, calendar.pmSymbol) // 오전 오후
print(calendar.eraSymbols) // ["BC", "AD"]
print(calendar.weekdaySymbols) // ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"]
print(calendar.quarterSymbols) // ["제 1/4분기", "제 2/4분기", "제 3/4분기", "제 4/4분기"]
print(calendar.monthSymbols) // ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"]
print(calendar.longEraSymbols) // ["기원전", "서기"]

 

⌛️ DateComponents

달력이나 시간대에서 특정되는 단위(예: 년, 월, 일, 시간, 분)로 지정된 날짜 또는 시간입니다.

var calendar = Calendar(identifier: .gregorian) // 인스턴스 생성: 캘린더 유형 설정
let dateComponents = DateComponents(year: 2222, month: 2, day: 22) // 원하는 요소만 입력하여 날짜 추출
let myDate = calendar.date(from: dateComponents) // date타입으로 변환. 옵셔널 타입이다.

let formatter = DateFormatter() // 포맷설정을 위해 인스턴스 생성
formatter.locale = Locale(identifier: "ko_kr") // 한국 시간으로 지정
formatter.dateStyle = .full // 날짜스타일 지정
print(formatter.string(from: myDate!)) // 2222년 2월 22일 금요일

이렇게 사용 가능하고

 

let date = Date()
print(calendar.dateComponents([.weekday, .day, .month, .year], from: date)) // year: 2021 month: 8 day: 25 weekday: 4 isLeapMonth: false

이렇게 component들을 추출할 수 도 있습니다.

 

참고:

https://leeari95.tistory.com/30

 

[Swift] 시간과 날짜를 다루는 타입에 대해서 알아보자.

Date 관련 타입들은 앱 개발을 할때 굉장히 많이 사용하게 되는 타입중 하나이다. 시간과 날짜를 다루는 타입들은 swift 기본 프레임워크인 Foundation에 포함되어 있다. 🔍 Date Apple Developer Documentation

leeari95.tistory.com

https://medium.com/@Alpaca_iOSStudy/%EB%82%A0%EC%A7%9C-%EB%8B%A4%EB%A3%A8%EA%B8%B0-b008fa101da

 

날짜 다루기

iOS에서 날짜를 다루는 방법에 대해 알아보자.

medium.com

https://soooprmx.com/%eb%82%a0%ec%a7%9c%ec%99%80-%ec%8b%9c%ea%b0%84%ec%9d%84-%eb%8b%a4%eb%a3%a8%ea%b8%b0swift/