오늘은 Swift로 날짜를 다루는 방법들을 정리해보았습니다.
Date, Calendar, DateComponent를 정리할 예정이며
본 글은 Date 객체를 소개하는 글입니다.
Init
기본 Init
1
let basicInit = Date()
Date 인스턴스를 기본 initializer로 생성하면 현재 시간으로 세팅됩니다.
timeIntervalSinceNow
1
let timeInterValSinceNowInit = Date(timeIntervalSinceNow: 3600)
현재로부터의 시간간격을 인자로 주어 그만큼 떨어진 시간을 나타내는 인스턴스가 생성됩니다.
Type Method, Variable
현재 시각 반환
1
let now = Date.now
단순한 현재 시각을 반환하는 방법입니다.
Date()와 같은 결과물입니다.
지정되지 않은 미래/과거의 값 반환
1
2
let iDontKnowWhenButAnywayItsFutureThanNow = Date.distantFuture
let iDontKnowWhenButAnywayItsPastThanNow = Date.distantPast
단순히 현재보다 과거/미래만을 표현하고 싶을때 사용하면 유용한 타입 변수들입니다.
지정되지 않은(알 수 없는) 시점의 값이지만 현재보다 과거/미래라는 사실을 보장합니다.
Date의 논리연산
1
2
let itsTrue = Date() > Date.distantPast
let itsFalse = Date() > Date.distantFuture
Date를 가지고 논리연산이 가능합니다.
Date값이 더 크다는 것은 더 미래라는 의미입니다.
Distance, Interval
1
2
3
let timeIntervalCanBeNegative = Date().distance(to: Date.distantPast)
let someIntervalFromNow = Date().timeIntervalSince(Date.distantPast)
let someIntervalSinceNow = (Date.distantFuture).timeIntervalSinceNow
특정시간으로부터 떨어진 시간 간격을 알려줍니다.
값은 TimeInterval
type으로 나옵니다.
Date 값 연산
1
2
3
4
5
var currentDate = Date() // Date는 class가 아닌 struct이기에 var로 선언해야 수정가능
currentDate.addTimeInterval(10000)
currentDate -= 10000
let tomorrow = currentDate.advanced(by: 60*60*24)
let rangeOfDate = currentDate...tomorrow
연산기호를 통한 연산, 연산 전용 메서드 두 방법 모두로 연산이 가능합니다.
date의 범위를 변수에 담을 수도 있습니다.
Date Formatting
Default Format
1
print(Date().formatted())
별다른 설정을 하지 않고 formatted() 메서드를 호출하면
date style은 numeric, time style은 shortened로 설정되어 출력됩니다.
Format Style 지정
1
print(Date().formatted(date: .long, time: .standard))
위와 같이 직접 date style과 time style을 지정할 수 있습니다.
date style의 종류
- abbreviated
- complete
- long
- numeric
- omitted
time style의 종류
- complete
- omitted
- shortened
- standard
Relative Format Style
1
2
3
4
5
6
let yesterday = currentDate.advanced(by: -60*60*24)
var formatStyle = Date.RelativeFormatStyle() // FormatStyle이란 프로토콜 채택중
formatStyle.presentation = .named
print(yesterday.formatted(formatStyle)) // 어제
formatStyle.presentation = .numeric
print(yesterday.formatted(formatStyle)) // 1일 전
1주 전, 1일 전, 어제 등의 관계성 formatting style도 지정할 수 있습니다
Format Style Custom
1
func formatted<F>(_ format: F) -> F.FormatOutput where F : FormatStyle, F.FormatInput == Date
formatted 메서드는 위와 같이 생겼습니다.
F가 FormatStyle 프로토콜을 채택하고 FormatInput이라는 associatedType이라면
formatted에 직접 만든 custom format을 적용할 수 있습니다.
왜 Date 관련 변수에 1970이란 숫자가 자주 등장하나요?
Unix의 standard time이 1970/1/1 입니다.
Unix -> C -> Swift로 넘어오면서 이것이 이어져온 듯 하네요