카테고리 없음

프로젝트에 쓰였던 Date 처리

훈하 2021. 8. 18. 02:50

import Foundation

var date = Date()

let calendar = Calendar.current

 

// 시작 날, 캘린터 현재 날을 뜻하는거같다 

let startDay = Calendar.current.startOfDay(for: date)

let endDay = Calendar.current.date(byAdding: .month, value: 1, to: startDay)!

print(startDay, endDay)  // 2021-08-17 15:00:00 +0000, 2021-09-17 15:00:00 +0000

 

현재 달의 첫날과 마지막 날 구하기 위해 쓰인 메소드

let interval = Calendar.current.dateInterval(of: .month, for: date)

print(interval!.start, interval!.end) // 2021-07-31 15:00:00 +0000, 2021-08-31 15:00:00 +0000

 

interval.end 와 lastDay date 값이 같은지 비교

let lastDay = calendar.date(byAdding: .day, value: 13, to: date) // 8월31일 

print(lastDay, interval!.end)  //. Optional(2021-08-30 17:39:30 +0000) ,  2021-08-31. 15:00:00 +0000

print(lastDay == interval!.end) //  false

 

DateFormatter를 통해 값 변환 후 비교 

let df = DateFormatter()

df.dateFormat = "yyyy-M-dd"

var lastDayString = df.string(from: lastDay!)

var intervalString = df.string(from: interval!.end)

print(lastDayString, intervalString) // 2021-8-31,  2021-9-01

print(lastDayString == intervalString)  // false 

 

print(df.string(from: startDay)) // 2021-8-18

 

8월 1일자 데이터가 7월에도 표시되는 버그를 발견 원인을 알고자

다시 Date 처리 과정을 알아보았다.

 

NSPredicate(format: "date >= %@ && date <= %@",

                                             dates.start as NSDate,

                                             dates.end as NSDate)

start , end 에는  dateInterval(of:) 메소드를 통해 나온 값이 들어갔었다

 

end를 그대로 넣었을시 2021-08-01 >=  date && date <= 2021-09-01 식으로 비교를 하기때문에 

7월에 8월 1일자 데이터가 표시 되었던것

 

8월달만 정확히 비교하려면 "date >= %@ && date < %@",  <= 해당 부분만 수정해주면 된다