프로젝트에 쓰였던 Date 처리
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 < %@", <= 해당 부분만 수정해주면 된다