iOS/Swift + Objective-c

[Swift] 날짜 다루기, 오늘 날짜 조회, 시간 계산 (Date, Calendar, DateComponents)

안경 쓴 귀니 2023. 4. 8. 17:49
반응형

Swift에서 시간 다루는 방법

Date, Calendar, DateComponents 설명 및 사용 방법

 

1. Date

A specific point in time, independent of any calendar or time zone.
달력이나 시간대와 관계없이 특정 시점입니다.

 

1) 현재 시간 가져오기

let date = Date()

 

2) Date를 원하는 Format으로 가져오기 (Date -> String)

let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"	// Format 설정
let dateString = dateFormatter.string(for: date)
// 2023-04-08 15:31

※ Date Format 형식은 아래를 참고

https://nsdateformatter.com/#reference

 

3) String을 Date로 변환하기 (String -> Date)

let dateString = "2023-05-10 05:07:55"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let date = dateFormatter.date(from: dateString)
// 2023-05-10 03:07:55 +0000

String 시간은 05:07:55인데, date가 03:07:55인 이유는 Date()가 UTC+0 기준이기 때문이다. (우리나라는 UTC+9)

그래서 다시 Date -> String을 해주면 아래처럼 dateString과 같은 값이 나온다.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateString = dateFormatter.string(for: date)
// 2023-05-10 05:07:55

 

4) Date String Format 변경하기

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"	// 변경하기 전 Format
if let date = dateFormatter.date(from: "2023-04-05") {	// 변경할 String
    let newDateFormatter = DateFormatter()
    newDateFormatter.dateFormat = "yyyy.MM.dd"	// 변경할 Format
    let result = newDateFormatter.string(from: date)
    // 2023.04.05
}

 

5) 현재 시간 기준으로 어제, 내일 날짜 구하기

// 현재 : 2023-04-08 08:36:20 +0000

let tomorrow = Date(timeIntervalSinceNow: 86400)
// 2023-04-09 08:36:20 +0000

let yesterday = Date(timeIntervalSinceNow: -86400)
// 2023-04-07 08:36:20 +0000

※ TimeInterval: 시간 초를 의미 (Double)

※ 86400초 = 1일 

 

6) 특정 날짜에서 1일 전, 1일 후 날짜 구하기

let components = DateComponents(year:2024, month: 1, day: 1)
let since = calendar.date(from: components)!

let tomorrow = Date(timeInterval: 86400, since: since)
// 2024-01-01 15:00:00 +0000

let yesterday = Date(timeInterval: -86400, since: since)
// 2023-12-30 15:00:00 +0000

 

 

2. Calendar

A definition of the relationships between calendar units and absolute points in time, providing features for calculation and comparison of dates.
날짜 계산 및 비교를 위한 기능을 제공하는 달력 단위와 시간의 절대 지점 간의 관계에 대한 정의입니다.

 

1) 현재 캘린더 가져오기

let calendar = Calendar.current	// gregorian

 

2) 날짜의 구성요소 가져오기

// 날짜의 구성요소 한 개 가져오기
let components1 = calendar.component(.year, from: now)
// 2023

// 날짜의 구성요소 여러 개 가져오기
let components2 = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: now)
// year: 2023 month: 4 day: 8 hour: 15 minute: 8 isLeapMonth: false

 

 

3. DateComponents

A date or time specified in terms of units (such as year, month, day, hour, and minute) to be evaluated in a calendar system and time zone.
달력 시스템 및 시간대에서 평가할 단위(예: 연, 월, 일, 시 및 분)로 지정된 날짜 또는 시간입니다.

 

1) 특정 날짜 만들기

아래 필드 값을 지정하여 날짜를 만든다.

init(calendar:timeZone:era:year:month:day:hour:minute:second:nanosecond:weekday:weekdayOrdinal:quarter:weekOfMonth:weekOfYear:yearForWeekOfYear:)

 

2023년 5월 10일 만들기 (DateComponents -> Date?)

let components = DateComponents(year: 2023, month: 5, day: 10)
// components = year: 2023 month: 5 day: 10 isLeapMonth: false 
let calendar = Calendar.current
let date = calendar.date(from: components)  // DateComponents -> Date
// date = Optional(2023-05-04 15:00:00 +0000)

 

원하는 Format으로 String 가져오기 (Date -> String?)

let dateFormatter = DateFormatter()
// 포맷 설정
dateFormatter.dateFormat = "yyyy년 MM월 dd일"	// 2023년 05월 10일
dateFormatter.dateFormat = "yyyy년 M월 d일"	// 2023년 5월 10일
let dateString = dateFormatter.string(for: date)

 

2) 두 날짜(시간) 차이 구하기

// 2023-10-05 03:05
let date = DateComponents(year: 2023, month: 10, day: 5, hour: 3, minute: 5)
// 2023-03-04 11:45
let compareDate = DateComponents(year:2023, month: 3, day: 4, hour: 11, minute: 45)

let compareComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: date, to: compareDate)
// year: 0 month: -7 day: 0 hour: -15 minute: -20 isLeapMonth: false

 

3) 날짜 계산하기

ex) 특정 날짜에서 며칠 전 날짜를 가져오거나, 5분 후 시간을 구하기

// 2023-05-05 10:10 에서 2일 후 날짜 가져오기
let calendar = Calendar.current
let dateComponents = DateComponents(year: 2023, month: 5, day: 5, hour: 10, minute: 10)
let date = calendar.date(from: dateComponents)!
// 2일 후 날짜 가져오기
let result = calendar.date(byAdding: .day, value: 2, to: date)  // Date?
// Optional(2023-05-07 01:10:00 +0000)

 

 

Extension 활용

extension Date {
	// Date에서 Component에 해당되는 값 가져오기
    var year: Int {
        let cal = Calendar.current
        return cal.component(.year, from: self)
    }                   
    var month: Int {
        let cal = Calendar.current
        return cal.component(.month, from: self)
    }
    var day: Int {
        let cal = Calendar.current
        return cal.component(.day, from: self)
    }
    var hour: Int {
        let cal = Calendar.current
        return cal.component(.hour, from: self)
    }
    var minute: Int {
        let cal = Calendar.current
        return cal.component(.minute, from: self)
    }
}

 

 

 

Refrence

 

Date - https://developer.apple.com/documentation/foundation/date

Calendar - https://developer.apple.com/documentation/foundation/calendar

DateComponents - https://developer.apple.com/documentation/foundation/datecomponents

TimeZone, Locale - https://velog.io/@kerri/TimeZone-Locale-DateFormat

날짜와 시간 다루기 - https://velog.io/@loganberry/Swift-%EB%82%A0%EC%A7%9C%EC%99%80-%EC%8B%9C%EA%B0%84-%EB%8B%A4%EB%A3%A8%EA%B8%B0-1-feat.-Date-Calendar

반응형