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
'iOS > Swift + Objective-c' 카테고리의 다른 글
[iOS] No such module 'XCTest' 해결 방법 (3) | 2024.12.11 |
---|---|
[iOS] 웹뷰 디버깅 방법 - 사파리로 웹뷰 디버깅 (WebView, Safari) (4) | 2023.07.12 |
[Swift] UITableView cell 선택하기 (프로그래밍 방식) (0) | 2023.03.08 |
[Swift / Objective-c] 디바이스 USIM 확인하기 (유심 확인) (0) | 2022.12.20 |
[Swift] 키체인 설명 및 사용 방법 (Keychain) (1) | 2022.09.28 |