본문 바로가기
아이폰 개발/Swift

swift Date 날짜 달력 관련 클래스 정리

by 인생여희 2021. 9. 24.

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 포함 안 됩니다.
 */

 

 

소스코드

main.swift
0.01MB