티스토리 뷰

Swift&IOS

날짜 비교하기

밀쿄 2019. 12. 24. 11:04

안녕하세요 밀쿄입니다.
오늘은 날짜를 비교하는 방법에 대해서 알아보겠습니다.
제가 날짜를 비교할 때 두 날짜의 차이를 연산해서 0인지 늘 체크했었는데 그것보다 더 간단한 방법이 있더라구요.
오늘은 그거에 대해 알아보겠습니다,
하지만 그거만 하면 글이 짧아질 것 같으니 유용한 팁 하나도 같이 넣어두겠습니다.


○ Date()로 생성한 날짜로 현지 시간에 맞게 출력하고 싶을 때

let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy. MM. dd HH:mm:ss"
dateFormatter.timeZone = TimeZone.current
print(dateFormatter.string(from: date))
//출력: 2019. 12. 24 10:41:48

보통은 이렇게 String으로 변환하면서 타임존을 설정해서 현지 시간에 맞게 출력합니다.

하지만 지금 우리가 해볼 것은 Date타입 그대로 현지 시간에 맞게 출력해봅시다.

var date = Date()
date.addTimeInterval(3600 * 9)
print(date)
// 출력: 2019-12-24 10:42:10 +0000

이렇게 할 수 있습니다. 쉽죠?

하지만 이렇게하면 표준시(그리니치 천문대)와 시차가 얼마인지 알아야하고 현지 시간에 대응하기 어렵습니다.

그럼 어떻게해야할까요? 

그리니치 천문대와 현재 타임존과 시차를 그대로 알려주는 함수가 있으면 해결될 것 같습니다,

애플에서는 그걸 위해서 함수를 제공해주고 있습니다. ( 여기 )

print(TimeZone.current.secondsFromGMT())
//출력: 32400

32400이란 값은 초단위 입니다. 즉 32400초라는거죠. 그리고 보이는 것처럼 Int타입입니다.

쉽게말하면 1시간에 3600초니까 9시간차이가 난다는 뜻입니다,

저걸 활용해서 어떻게 하면 좋을까요?

Date를 생성할 떼 저 숫자만큼 더해주면 되겠죠?

그 역할을 하는 함수 역시 존재합니다 ( 여기 )

let calendar = Calendar.current
let today = Date()
let localDate = Date(timeInterval: TimeInterval(calendar.timeZone.secondsFromGMT()), since: today)
// 출력
// 2019-12-24 01:48:43 +0000
// 2019-12-24 10:48:43 +0000

정확하게 잘 나옵니다. 단지 이렇게 생성하면 타임존은 바뀌지않습니다.

참고로 TimeInterval은 typealias로써 그냥 Double의 또 다른 별칭입니다.

쉽게 생각하면 Int를 TimeInterval이란 Double로 감싸서 Double로 바꿔준 거라고 생각하시면 되겠습니다.

 

자 그럼 오늘의 본론으로 돌아가서 날짜를 어떻게 비교하는 지 한 번 시작해봅시다.

let calendar = Calendar.current
let today = Date()
let localDate = Date(timeInterval: TimeInterval(calendar.timeZone.secondsFromGMT()), since: today)

if calendar.compare(today, to: localDate, toGranularity: .day) == .orderedSame {
    print("This is True")
} else {
    print("This is False")
}
//출력: This is True

이렇게 비교하면 됩니다. 정말 쉽고 간단합니다.

지금은 같은 날짜인지 비교했지만 toGranularity에 넣는 거에 따라 다양한 것을 넣을 수 있습니다.

toGranularity은 Calendar.Component 타입이므로 애플문서에 컴포넌트에 뭐가 있는지 보고 적재적소에 맞는걸 넣으셔서 비교하시면 됩니다.

 

'Swift&IOS' 카테고리의 다른 글

translatesAutoresizingMaskIntoConstraints  (0) 2019.12.30
[AutoLayout] leading, trailing, left, right  (0) 2019.12.26
[AutoLayout] FirstBaseLineAnchor & LastBaseLineAnchor  (0) 2019.12.22
Sequence  (0) 2019.12.17
MVC(Model-View-Controller)?  (0) 2019.10.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함