iyOmSd/Title: Swift

[Swift] 날짜형식 변환하기, 시간차 구하기

냄수 2019. 9. 17. 14:07
반응형

+ 2020.03.02일 추가 업로드

 

 

 

안녕하세요😄😄

 

이번에는 날짜형식의 데이터를 자신의 입맛에 맞게 바꾸는 작업과 두 날짜간 시간차를 구하는 방법을 알아볼게요

 

가지고있는 날짜데이터를 원하는 패턴으로 나타내고 싶을 때가 있죠!!

 

DateFormatter 이란 클래스를 이용할거에요

 

//데이터형식 2019-09-17 13:40:00
let format = DateFormatter()
format.dateFormat = "yyyy-MM-dd HH:mm:ss"
        
guard let startTime = format.date(from: self.start) else {return "?"}
guard let endTime = format.date(from: self.end) else {return "?"}
        
//원하는 형식으로 다시 바꾸기
format.dateFormat = "HH:mm"
let s = format.string(from: startTime)
let e = format.string(from: endTime)
        
format.dateFormat = "yyyy.MM.dd"
let f = format.string(from: startTime)
let dateText = "\(f) (\(s) - \(e))"

 

2019-09-17 13:40:00

이런형식으로 날짜를 보여주는 String값이 있다면

먼저 DateFormatter 변수의 dateFormat을 이 날짜형식에 맞게 셋팅해줘야되요

 

a: am/pm -> Locale(identifier: "ko") 같이 한국으로 설정해주면 오전/오후로 표시되요

e: 요일 -> e의 갯수에따라서 월, 월요일, 주간요일순서를 숫자로 표현해줘요

y: 년

M: 월

d: 일

D: 365일중 일나타냄

H: 시(24시표현)

h: 12시형식

m: 분

s: 초

 

를 뜻하는 기호구요 중간에 ' - ' 과 공백도 맞춰서 똑같이해줘야 변환 시킬 수 있어요

 

format.date은 방금 맞춘 형식을 통해서 문자열을 Date의 형식으로 바꾸어 주는 역할을 해요

 

그러면이제 Date형 데이터를 가지고있으니까 제 입맛에 맞게 패턴을 정의하고 보여 줄 수 있어요

 

다시 dateFormat을 이용해서 보여주고싶은 패턴으로 바꿔줘요!!

에서한 dateFormatString값을 Date형식으로 받기위해 설정하였다면

아래에하는 dateFormat은 제가가지고있는 Date형식을 제가 원하는 형식에맞게 String으로 바꿔주기위해 하는 작업이에요

 

예를들어 HH:mm 으로 설정하고

format.string을 통해서 가지고있는 날짜데이터가 패턴에맞게 String으로 변환되서 저장될거에요

HH:mm 이라면 13:40 이란 String이 저장 되겠네요!!

 

yyyy.MM.dd 이라면

2019.09.17 이란 String이 저장될거구요

 

yyyy@ HH : mm 이라면

2019@ 13 : 40 이라는 String이 저장 될거에요!

 

 

이렇게 DateFormatter를 잘이용하면 원하는 날짜 형식으로 표현이 가능해요

 

마지막으로 한번더 정리해 볼게요!!

 

String에서 Date로 변환하고 다시 원하는 String으로 변환하는 작업

	// String날짜 -> 원하는포맷 -> 새로운String날짜
    func stringConvertToDateTime() -> String {
        let stringFormat = “yyyy년 MM월 dd일 HH:mm”
        let formatter = DateFormatter()
        formatter.dateFormat = stringFormat
        formatter.locale = Locale(identifier: "ko")
        guard let tempDate = formatter.date(from: self) else {
            return ""
        }
        formatter.dateFormat = "yyyy년 MM월 dd일 eeee"
        
        return formatter.string(from: tempDate)
    }
    
    //
    // 출력:	2020년 03월 02일 월요일
    //
    

 

Date에서 원하는 String으로 변환하는 작업

	// Date날짜 -> 원하는포맷 -> 새로운String날짜
    func dateToStringChatTime() -> String {
        let curDate = Date()
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "ko")
        formatter.dateFormat = "yyyy년 MM월 dd일 HH:mm"
        return formatter.string(from: curDate)
    }
    
    //
    // 출력:	2020년 03월 02일 14:44
    //
    

.

.

.

 

만약 시간차를 구하고 싶다면 

let format = DateFormatter()
format.dateFormat = "yyyy-MM-dd HH:mm:ss"
        
guard let startTime = format.date(from: self.start) else {return "?"}
guard let endTime = format.date(from: self.end) else {return "?"}

var useTime = Int(endTime.timeIntervalSince(startTime))

이런식으로 Date형 변수를 2개 생성한뒤

timeIntervalSince 를 통해서 시간차를 구할 수 있어요

반환값은 초단위가 반환되므로 분을 구하고 싶다면 60을 나눠주는 방법으로 저장하면 되요

 

 

아래처럼  86400(24시간)을 나눠서 몇일인지도 비교할 수 있어요

floor은 버림을 나타내는 연산이에요

guard var startDay = model.startSaveDate?.timeIntervalSinceReferenceDate else {
    return true
}
startDay = floor(startDay/86400)*86400

guard var endDay = model.endSaveDate?.timeIntervalSinceReferenceDate  else {
    return true
}
endDay = floor(endDay/86400)*86400

 

 

하지만

이런 식의 비교는 초단위 비교라서

날짜 비교에는 적합하지 않아요

같은날이여도 초가 다르면 다른 날이되거든요!!

또한, 버림을 하거나 나누기 연산을할때 값이 달라져서 오류가 생길거에요

 

Date형을 Calendar형으로 변환해서 년,월,일을 따로 가져올거에요

Calendar.current.dateComponents([.날짜옵션], from: Date형변수)

원하는 옵션을넣어줘요

년, 월, 일을 다가져오고 싶으면

.year, .month, .day 이렇게 넣어주면되요

Date변수를 넣어주면 알맞게 계산되서 값을 꺼내서 쓸수가 있어요

 

반환값으로 isLeapMonth이란게 있는데

isLeapMonth: 윤달확인가능, ture시 윤달이에요

    func isChatTomorrowWithString(dateString: String) -> Bool {
        let firebaseFormat = “yyyy년 MM월 dd일 HH:mm”
        let formatter = DateFormatter()
        formatter.dateFormat = firebaseFormat
        formatter.locale = Locale(identifier: "ko")
        
        guard let tempDate1 = formatter.date(from: self) else {
            return false
        }
        guard let tempDate2 = formatter.date(from: dateString) else {
            return false
        }
        
        let date1 = Calendar.current.dateComponents([.year, .month, .day], from: tempDate1)
        let date2 = Calendar.current.dateComponents([.year, .month, .day], from: tempDate2)
        
        if date1.year == date2.year && date1.month == date2.month && date1.day == date2.day {
            return false
        } else {
            return true
        }
    
    }

 

년도비교

월비교

일비교

 

를 통해서 원하는 로직을 만들 수 있겟죠??

 

 

 

 

 

 

 

 

 

반응형