swift Date 날짜 달력 관련 클래스 정리
현재표준시간
//MARK: 현재표준시간
let date1 = NSDate()
print(" date1 : \(date1)")
// date1 : 2021-09-24 14:32:48 +0000
현시점을 기준으로 여러연산을 초단위를 이용하는법
//MARK: 현시점을 기준으로 여러연산을 초단위를 이용하는법
/// timeInterval: double형의 초 (86400초(하루))
/// 현재 시점의 날짜와 시간(시스템에 찍힌)
let now = Date()
print(" now : \(now)")
///현재 날짜를 기준으로 매개변수로 전달된 TimeInterval만큼 후의 시간(-값을 전달할 경우 전의 시간)
let tomorrowFromNow = Date(timeIntervalSinceNow: 86400)
print(" tomorrowFromNow : \(tomorrowFromNow)")
let yesterdayFromNow = Date(timeIntervalSinceNow: -86400)
print(" yesterdayFromNow : \(yesterdayFromNow)")
let theDayAfterTomorrow = Date(timeInterval: 86400, since: tomorrowFromNow)
print(" theDayAfterTomorrow : \(theDayAfterTomorrow)")
/// 21세기 시작 지점 2001. 1. 1 00:00:00 UTC를 기준으로 TimeInterval만큼 후의 시간
let timeSince2001 = Date(timeIntervalSinceReferenceDate: 86400)
print(" timeSince2001 : \(timeSince2001)")
/// epoch(Unix 기준 시작 시점) 1970. 1. 1 00:00:00 UTC를 기준으로 Time Interval만큼 후의 시간
let timeSince1970 = Date(timeIntervalSince1970: 86400)
print(" timeSince1970 : \(timeSince1970)")
/*
now : 2021-09-24 14:32:48 +0000
tomorrowFromNow : 2021-09-25 14:32:48 +0000
yesterdayFromNow : 2021-09-23 14:32:48 +0000
theDayAfterTomorrow : 2021-09-26 14:32:48 +0000
timeSince2001 : 2001-01-02 00:00:00 +0000
timeSince1970 : 1970-01-02 00:00:00 +0000
*/
날짜계산
TimeInterval을 이용하여 +, -, >, <, >=, +=, 등등 의 연산자를 활용해서 시간비교가능.
연산자에 입력되는 파라메타는 항상 Date, TimeInterval(초) 혹은 Date, Date이어야 한다.
let tomorrow = now + 86400
let yesterday = now - 86400
if tomorrow > yesterday {
print("참")
}else{
print("거짓")
}
if now == tomorrow {
print("참")
}else{
print("거짓")
}
/*
참
거짓
*/
DateFormatter 활용
임의의 날짜는 만들기
Date 타입은 날짜의 한 지점을 나타내지만 이것을 텍스트로 표현하고 싶을 때는 DateFormatter를 사용한다.
DateFormatter를 인스턴스화 시켜 사용하며 dateStyle, timeStyle, locale, 그리고 dateFormat을 통해 다양한 방법으로 Date를 표시한다.dataFormat을 정확하게 명시한 후, 아래와 같이 date(from: String) 함수를 이용하여 date값으로 변경.
//MARK: String -> Date 1
let dateForm1 = DateFormatter()
dateForm1.dateFormat = "yyyy-MM-dd HH:mm"
let time1 = dateForm1.date(from: "2021-09-05 12:15")
print("time1 :\(String(describing: time1))" )
//MARK: Date -> String 1
let dateForm2 = DateFormatter()
dateForm2.locale = Locale(identifier: "UTC")
dateForm2.timeZone = TimeZone(abbreviation: "KST")
dateForm2.dateFormat = "yyyy-MM-dd HH:mm:ss"
let time2 = dateForm2.string(for: now)
print((time2 ?? ""))
//MARK: String -> Date 2
let dateStr = "2020-08-13 16:30" // Date 형태의 String
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" // 2020-08-13 16:30
let convertDate = dateFormatter.date(from: dateStr) // Date 타입으로 변환
print((convertDate ?? ""))
//MARK: Date -> String 2
let myDateFormatter = DateFormatter()
myDateFormatter.dateFormat = "yyyy년 MM월 dd일 a hh시 mm분"
myDateFormatter.locale = Locale(identifier:"ko_KR") // PM, AM을 언어에 맞게 setting (ex: PM -> 오후)
let convertStr = myDateFormatter.string(from: convertDate!)
print((convertStr))
/*
time1 :Optional(2021-09-05 03:15:00 +0000)
2021-09-24 23:32:48
2020-08-13 07:30:00 +0000
2020년 08월 13일 오후 04시 30분
month: 9 day: 24 isLeapMonth: false
1997-12-31 15:00:00 +0000
*/
Calendar 객체
각각의 일, 월, 시, 분, 초 구하기 - Calendar 구조체
이 구조체를 이용하여 달력에 있는 단위(년, 월, 일 등)를 계산하고 비교할 수 있다.
이에 사용되는 핵심 Method는 dateComponents(_:from)이다.
let date = Date()
let calendar = Calendar(identifier: .gregorian)
print(calendar.dateComponents([.day, .month], from: date))
var dateComponents = DateComponents()
dateComponents.year = 1998
print(calendar.date(from: dateComponents) ?? Date())
let curDate = Date()
let curCalendar = Calendar.current
let curComponents = curCalendar.dateComponents([.hour, .minute , .second], from: curDate)
print("curComponents : \(curComponents)")
print("curComponents.hour : \(String(describing: curComponents.hour))")
print("curComponents.minute : \(String(describing: curComponents.minute))")
print("curComponents.second : \(String(describing: curComponents.second))")
/*
curComponents : hour: 23 minute: 32 second: 48 isLeapMonth: false
curComponents.hour : Optional(23)
curComponents.minute : Optional(32)
curComponents.second : Optional(48)
*/
날짜 차이 - 1
let dateFormatter2 = DateFormatter()
dateFormatter2.dateFormat = "yyyy-MM-dd"
let startDate = dateFormatter2.date(from: "2021-09-01") ?? Date()
let endDate = dateFormatter2.date(from: "2021-09-05") ?? Date()
let interval = endDate.timeIntervalSince(startDate)
let days = Int(interval / 86400)
print("\(days) 일 차이 난다") //4일
날짜 차이 - 2
let calendar3 = Calendar.current
let dateGap = calendar3.dateComponents([.year , .month , .day , .hour], from: startDate , to: endDate)
if case let (y? , m? , d? , h?) = (dateGap.year , dateGap.month , dateGap.day , dateGap.hour)
{
print("\(y)년. \(m)월. \(d)일. \(h)시간 후")
}
//0년. 0월. 4일. 0시간 후
10일째 되는날 ?
let now0 = Date()
let calendar0 = Calendar.current
let dateFormatter0 = DateFormatter()
dateFormatter0.dateFormat = "yyyy-MM-dd"
var day10 = DateComponents()
day10.day = 10
if let d10 = calendar0.date(byAdding: day10, to: now0){
print("오늘부터 \(String(describing: day10.day)) 일 후 날짜는 ? \(dateFormatter0.string(from: d10))" )
}
//오늘부터 Optional(10) 일 후 날짜는 ? 2021-10-04
날짜 포함 여부 구하기
func checkDate(){
let beginDateTime = "2021092014"
let endDateTime = "2021092415"
let now = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyyMMddHH"
let nowDateTime = dateFormatter.string(from: now)
let nowDate = dateFormatter.date(from: nowDateTime) ?? Date()
let beginTimeDate = dateFormatter.date(from: beginDateTime) ?? Date()
let endTimeDate = dateFormatter.date(from: endDateTime) ?? Date()
print("현재 날짜 : \(nowDate)")
print("시작일 : \(beginTimeDate)")
print("종료일 : \(endTimeDate)")
if beginTimeDate <= nowDate && nowDate <= endTimeDate {
print("오늘 000 포함됩니다.")
}else{
print("오늘 000 포함 안 됩니다.")
}
}
checkDate()
/*
현재 날짜 : 2021-09-24 14:00:00 +0000
시작일 : 2021-09-20 05:00:00 +0000
종료일 : 2021-09-24 06:00:00 +0000
오늘 000 포함 안 됩니다.
*/
소스코드
'아이폰 개발 > Swift' 카테고리의 다른 글
swift DispatchGroup 과 DispatchSemaphore - 2 (0) | 2021.09.25 |
---|---|
swift DispatchGroup 과 DispatchSemaphore - 1 (0) | 2021.09.25 |
swift - 최상위 ViewController 구하기 (0) | 2021.08.10 |
swift custom popup - 재사용가능한 팝업 (0) | 2021.08.09 |
swift 스위치 - 위치이동 (0) | 2021.08.02 |