Date
UTC (Coordinated Universal Time)
๊ตญ์ ์ ์ธ ํ์ค ์๊ฐ - ํ์ ์ธ๊ณ์
๊ธฐ์กด ํ๊ท ํ์์์ธ ๊ทธ๋ฆฌ๋์น ํ์ค์(GMT)๋ฅผ ๋์ฒดํ์ฌ ์ฌ์ฉํ๋ค.
์ผ๋ฐ์ ์ผ๋ก GMT ์๊ฐ๊ณผ UTC ์๊ฐ์ ํผ์ฉํด์ ์ฌ์ฉํ๋ค.
์๊ตญ, ๋ฐ๋์ ๊ทธ๋ฆฌ๋์น ์ฒ๋ฌธ๋์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ๋ ์๊ฐ
์์
์ฐ๋ฆฌ๋๋ผ: UTC + 9 (์๊ตญ์ ๊ธฐ์ค์ผ๋ก 9์๊ฐ ์์ ๋ค)
๋ด์ : UTC - 5 (5์๊ฐ ๋๋ฆฌ๋ค.)
์ํ ๊ฐ ๋์ ๋๋ผ๋ ์ฌ๋ฌ๊ฐ์ ํ์ค์๋ฅผ ์ฌ์ฉํ๋ค. (์ค๊ตญ์ 1๊ฐ)
Date ๊ตฌ์กฐ์ฒด
๐ก Swift์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ๋ ์ง๋ฅผ ๋ค๋ฃจ๋ ๊ตฌ์กฐ์ฒด์ด๋ค.
Date()
: ํ์ฌ ์์ ์ Date ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ค.
๊ธฐ์ค ์์ (reference data, 2001.01.01 00:00:00 UTC)์์ ๋ช ์ด๊ฐ ๋จ์ด์ ธ์๋์ง๋ฅผ ๊ณ์ฐํ๋ค.
.timeIntervalSinceReferenceDate
TimeInterval
Type, ์ด ๋จ์์ ๊ฐ๋
์ด๋ค.
์๋ ฅ, ์๋ ฅ ๋ฑ ํ์ ์กด์ ์ํฅ์ ๋ฐ์ง ์๋ ๋
๋ฆฝ์ ์ธ ์๊ฐ์ ๊ฐ์ด๋ค.
์์์ ์ธ ๋ ์ง์ ์๊ฐ์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ค.
๋ฌ๋ ฅ, ํ์์กด (์ง์ญ)์ ๋ณํํ์ฌ ์ฌ์ฉํด์ผํ๋ค.
ํ์ํ ๊ฒฝ์ฐ ์ ์ ํ ํ์์ ๋ฌธ์์ด ํ์
์ผ๋ก ๋ณํํด์ ์ฌ์ฉํ ์ ์๋ค.
let now - Date() // ์์ฑ ์์ ์ ๋ ์ง์ ์๊ฐ (์ด ๋จ์)
print(now) // UTC ๊ธฐ์ค์ ์๊ฐ ์ถ๋ ฅ
now.timeIntervalSinceReferenceDate
Calendar
Date์ ์ค์ ํ์ฉ ๋ฐฉ๋ฒ
์๋ ฅ, ์๋ ฅ์ ๋ฌ๋ ฅ์ ๋ค๋ฃจ๋ Calendar ๊ตฌ์กฐ์ฒด ํ์ฉ
์ํ๋ ํ์์ ๋ฌธ์์ด๋ก ๋ณํํ๊ธฐ ์ํ DateFormatter ํด๋์ค ํ์ฉ
Calendar๊ตฌ์กฐ์ฒด
์ ๋์์ Date๋ฅผ ์ฐ๋/์ฐ๋/๋ ์ง/์์ผ ๋ฑ์ ๋ฌ๋ ฅ์ ์์๋ก ๋ณํ์ ๋์์ค๋ค.
Calendar.current
๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ(Gregorian calendar: ์๋ ฅ)
Calendar.autoupdatingCurrent
์ ์ ๊ฐ ์ ํํ ๋ฌ๋ ฅ ๊ธฐ์ค (์ธ๊ณ์ ์๋น์ค)
์ง์ญ ์ค์
๋๋ผ๋ง๋ค ๋ ์ง์ ์๊ฐ์ ํ๊ธฐํ๋ ํ์๊ณผ ์ธ์ด๊ฐ ๋ค๋ฆ
var calendar = Calendar.current
// ๋ฌ๋ ฅ์ ์ง์ญ, ๋ฌ๋ ฅ ํ๊ธฐ ๋ฐฉ๋ฒ
calendar.locale
// timezone, UTC ์๊ฐ๊ณผ ๊ด๋ จ๋ ๊ฐ๋
calendar.timeZone
calendar.locale = Locale(identifier: "ko_KR")
Date์ ๋
/์/์ผ/์/๋ถ/์ด ํ์ธ
// 1) ๋ ์ง - ๋
/ ์ / ์ผ
let year: Int = calendar.component(.year, from: now)
let month: Int = calendar.component(.month, from: now)
let day: Int = calendar.component(.day, from: now)
// 2) ์๊ฐ - ์ / ๋ถ / ์ด
let timeHour: Int = calendar.component(.hour, from: now)
let timeMinute: Int = calendar.component(.minute, from: now)
let timeSecond: Int = calendar.component(.second, from: now)
// ์์ผ
let weekday: Int = calendar.component(.weekday, from: now) // ์ผ: 1, ์: 2..
๐ก ์ค์ ์ฑ์์ ํ๊ธฐํ ๋, ์์ฒ๋ผ ๋ถ๋ฆฌํ์ฌ Label์ ํ์ํ๋ค.
let myCal = Calendar.current
var myDateCom = myCal.dateComponents([.year, .month, .day], from: now)
//myCal.dateComponents(<#T##components: Set<Calendar.Component>##Set<Calendar.Component>#>, from: <#T##Date#>)
myDateCom.year
myDateCom.month
myDateCom.day
print("\(myDateCom.year!)๋
\(myDateCom.month!)์ \(myDateCom.day!)์ผ")
์์
๋ฌ๋ ฅ์ ๊ธฐ์ค์ผ๋ก ๋์ด ๊ณ์ฐ
class Dog {
var name: String
var yearOfBirth: Int
init(name: String, year: Int) {
self.name = name
self.yearOfBirth = year
}
// ๋์ด๋ฅผ ๊ณ์ฐํ๋ ๊ณ์ฐ ์์ฑ
var age: Int {
get {
let now = Date()
let year = Calendar.current.component(.year, from: now)
return year - yearOfBirth
}
}
}
let choco = Dog(name: "์ด์ฝ", year: 2015)
choco.age
์ด๊ฑฐํ์ผ๋ก ์ฉ๋ฆฌ์ ๋ง๋ค๊ณ , ์ค๋์ ์์ผ ๊ณ์ฐ
enum Weekday: Int {
case sunday = 1, monday, tuesday, wednesday, thursday, friday, saturday
static var today: Weekday {
let weekday: Int = Calendar.current.component(.weekday, from: Date())
return Weekday(rawValue: weekday)!
}
}
// ์ค๋์ด ๋ฌด์จ์์ผ์ธ์ง
let today = Weekday.today
๋ ๋ ์ง ์ฌ์ด์ ์ผ ์ ๊ณ์ฐ
let startDate = Date()
let endDate = startDate.addingTimeInterval(3600 * 24 * 60) // 60์ผ ํ
let calendar2 = Calendar.current
let someDays = calendar2.dateComponents([.day], from: startDate, to: endDate).day!
print("\(someDays)์ผ ํ")
DateFormatter
Date Formatter
๐ก ๋ ์ง์ ์๊ฐ์ ์ํ๋ ํ์์ ๋ฌธ์์ด๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ํด๋์ค์ด๋ค. RFC 3339 ํ์ค์ผ๋ก ์์ฑ๋์๋ค. Date๋ฅผ ํน์ ํ์์ ๋ฌธ์์ด๋ก ๋ณํํ๊ธฐ ์ํด์๋ **์ง์ญ, ์๊ฐ๋, ๋ ์งํ์, ์๊ฐํ์**์ ์ง์ ํด์ผํ๋ค.
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ
let formatter = DateFormatter()
// 1. ์ง์ญ ์ค์
formatter.locale = Locale(identifier: "ko_KR")
// 2. ์๊ฐ๋ ์ค์ , default ๊ฐ ์กด์ฌ
formatter.timeZone = TimeZone.current
// 3. ๋ ์ง ํ์ ์ค์
formatter.dateStyle = .full // "Tuesday, April 13, 2021"
//formatter.dateStyle = .long // "April 13, 2021"
//formatter.dateStyle = .medium // "Apr 13, 2021"
//formatter.dateStyle = .none // (๋ ์ง ์์ด์ง)
//formatter.dateStyle = .short // "4/13/21"
// 4. ์๊ฐ ํ์ ์ ํ
formatter.timeStyle = .full // "2:53:12 PM Korean Standard Time"
//formatter.timeStyle = .long // "2:54:52 PM GMT+9"
//formatter.timeStyle = .medium // "2:55:12 PM"
//formatter.timeStyle = .none // (์๊ฐ ์์ด์ง)
//formatter.timeStyle = .short // "2:55 PM"
// ์ฌ์ฉ
let timeString = formatter.string(from: Date())
print(timeString)
์ปค์คํ
ํ์์ผ๋ก ์์ฑ
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "ko_KR")
formatter.dateFormat = "yyyy๋
MMMM d์ผ(E)"
let timeString = formatter.string(from: Date())
๋ฌธ์์ด์์ Date๋ก ๋ณํ
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd"
let date = newFormatter.date(from: "2023/01/01)
print(date) // Date ํ์
๋ ๋ ์ง ์ฌ์ด์ ์ฐจ์ด
let start = Date()
let end = start.addingTimeInterval(3600 * 24 * 60) // 60์ผ ํ
let formatter DateFormatter()
formatter.locale = Locale(identifier: "ko_KR")
formatter.timeZone = TimeZone.current
// formatter.timeZone = TimeZone(identifier: "Asiz/Seoul")
formatter.dateStyle = .long
formatter.timeStyle = .none
print("๊ธฐ๊ฐ: \(formatter.string(from: start)) - \(formatter.string(from: end))")
Date Component
DateComponents
๋ ์ง์ ์๊ฐ์ ์์๋ค์ ๋ค๋ฃฐ ์ ์๋ ๊ตฌ์กฐ์ฒด
์ํ๋ ํน์ ๋ ์ง, ์๊ฐ์ ์์ฑํ ์ ์๋ค.
var components = DateComponents()
components.year = 2021
components.month = 1
components.day = 1
components.hour = 12
components.minute = 30
components.second = 0
let specifiedDate: Date = Calendar.current.date(fromt: components)!
// ๊ตฌ์กฐ์ฒด์ ํ์ฅ
extension Date {
init?(y year: Int, m month: Int, d day: Int) {
var components = DateComponents()
components.year = year
components.month = month
componetns.day = day
guard let date = Calendar.curretn.date(from: components) else {
return nil // ์คํจ๊ฐ๋ฅ์์ฑ์๊ฐ ํ์ํ ์ด์
}
self = date // ๊ตฌ์กฐ์ฒด์ด๊ธฐ๋๋ฌธ์ self์ ์๋ก์ด ์ธ์คํด์ค ํ ๋น ๋ฐฉ์์ผ๋ก ์ด๊ธฐํ ๊ฐ๋ฅ
// ํ์ ๋ง๋ค์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅ self vs Self ๋น๊ต
}
}
datecomponents
์ ๋์ ์์ (์ด๊ธฐ์ค)์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
์ํ๋ ๋ ์ง, ์๊ฐ์ผ๋ก ์ธํ
ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ง์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ตฌํ
๊ณ์ ์ฌ์ฉํ๊ฒ ๋ ์ฝ๋๋ ์ฑ๊ฒฉ์ ํ์
ํด์ ์์ฑ์ด๋ ๋ฉ์๋ ๋ฑ์ผ๋ก ๊ตฌํํด์ ์ฝ๋์ ๋ฃ๋๋ค.
์ค์ ๋ก๋ ๊ณ์ฐ ์์ฑ(๋ณดํธ์ ), ํ์
๋ฉ์๋, ์
์ฑ์, ์๋ธ์คํฌ๋ฆฝํธ ๋ฑ์ผ๋ก ๊ตฌํํ๋ค.