2024. 3. 14. 17:49ㆍSwift
Date
이전 글에서 포스팅한 것중 잘못된 생각이 있어서 붙잡기위해서 다시 글작성
! 로직을 설명하기 앞서 주의사항 !해당 값들을 Print문으로 출력하면 하루 밀려서 나오게 되는 현상이 발생 → DateFormatter()로 format하면 정상적으로 출력된다.
위의말은 바보 같은말이였다. 빨리 깨닫게 되서 다행
하루가 밀려서 나오게되는게 아니라는걸 깨닫고 바보처럼글을 썻구나 생각하게됨 .. 잘알아보고 포스팅하자 😢
date를 print문으로 출력하면 현재 시간이 아닌 엉뚱한 시간이 나온다.
그 이유는 바로 시간이 나오는 기준이 영국시간기준 ! 하루가 밀려서 나오는게 아니다 ,,,
Date에 대해서 알아보자
https://developer.apple.com/documentation/foundation/date
Date 의 init 값 :현재 날짜및 시간으로 초기화된 날짜 생성
let date = Date() // 영국 기준+
func dateToString(format : String) -> String {
let formatter = DateFormatter()
formatter.dateFormat = format
return formatter.string(from: self)
}
위에 코드에서 한국기준으로 설정한 코드가 없는데도 해당함수를 이용하면 한국 기준으로 String이 변한된다. 왜일까
locale설정을 하지 않아도 자동으로 한국으로 나오는 이유는 locale의 default 는 언어및 지역설정을 기준으로 설정됨 → 현재 언어 및 지역설정이 한국이기 때문에 한국기준의 시간이 출력되게 되는것 ‼️
즉 locale의 기본값은 언어 및 지역 설정 기준
만일 다른나라에서도 특정 언어 및 지역 설정 기준으로 하고 싶다면
formatter.locale = Locale(identifier: "ko_KR") // 한국 기준으로 설정
→ 위의 코드를 사용하여 identifier를 사용하면 됨
현재 날짜가 속해있는 주간 날짜 구하기 - Update
https://dongjin97-ios.tistory.com/5
[Swift] 현재 날짜가 속해있는 주간 날짜 구하기
현재 진행하고 있는 프로젝트에서 현재 날짜가 속해 있는 주간 날짜를 구하는 로직이 필요해서 해당 기능을 구현하게 되었습니다. 주간 날짜구하기 Foundation의 Calendar와 Date를 활용해서 주간 날
dongjin97-ios.tistory.com
위글에 대한 수정버전
방식 : 처음 방식 Date ->String -> Int 변경후 마지막 날짜를 구하여 분기처리후 주간날짜 데이터 생성
위의 방식을 사용하게 되면 두번에 걸쳐서 데이터 타입을 변경해야되고 마지막 날짜를 구하는 코드도 필요하기 때문에 코드가 길어지고 복잡
CoreData설계를 하면서 날짜에 대한 정보를 String이 아닌 Date로 바꾸게 되면서 든 생각
첫번째날만 구해서 calendar.current 함수의 date함수를 사용하여 하루씩 증가 하면 마지막날짜를 구하지 않아도 되고 주간 데이터를 구한후 단순히 formatter를 이용하여 String으로 반환 하는 방식이 떠오름
이전 코드
var weeklyDates : [Int] = []
let calendar = Calendar.current
// MARK: - 현재 주의 시작 날짜
guard let result = calendar.dateInterval(of: .weekOfYear, for: Date()) else { return } // 현재 날짜가 속해있는 토요일부터 토요일까지 날짜 보여줌
guard let weeklyStartDate = calendar.date(byAdding: .day, value: 1, to: result.start)?.dateToString(format: "dd") else { return }
// MARK: - 현재 주의 마지막 날짜
let components = calendar.dateComponents([.year, .month], from: Date()) // 현재 날짜의 년도와 월
guard let currentStartDate = calendar.date(from: components) else { return } // 날짜와 년도를 가지고 가장 첫번째 날짜 Get
guard let nextStartDate = calendar.date(byAdding: .month, value: 1, to: currentStartDate) else {return} // 다음 달의 가장 첫번쨰날
guard let currentEndDate = calendar.date(byAdding: .day, value: -1, to: nextStartDate)?.dateToString(format: "dd") else {return} // 다음달의 가장 첫번째날 이전날 = 이번달의 마지막날
// MARK: - 주간 데이터 구하기
guard let weeklyStartDateInt = Int(weeklyStartDate) else { return }
guard let currentEndDateInt = Int(currentEndDate) else { return }
for i in 0...6 {
let date = weeklyStartDateInt + i
if date <= currentEndDateInt {
weeklyDates.append(date)
} else {
weeklyDates.append(date - currentEndDateInt)
}
}
한눈에 봐도 코드가 길다고 느껴짐...
해당 코드
let calendar = Calendar.current
guard let startDate = calendar.dateInterval(of: .weekOfYear, for: Date())?.start else { return }
guard let mondayDate = calendar.date(byAdding: .day, value: 1, to: startDate) else { return }
for i in 0...6 {
guard let date = calendar.date(byAdding: .day, value: i, to: mondayDate) else { return }
weeklyDates.append(date)
}
차이점 : 코드길이도 두배 줄어들고 해당 코드가 어떤기능을 하는지 파악하기 쉬움
리마인드 : 너무 복잡하게 생각하지말고 단순하게 생각 해보기!!
깨달은점 : 같은 데이터 타입의 계산은 해당 데이터 타입의 계산 함수를 사용하자 !!
타입 끼리 계산을 지원해주지 않는 타입도 있지만 Date처럼 하루추가 한달 추가를 할 수 있는 함수가 존재 하기 때문
마지막날짜에 분기를 처리해줘야되는 생각에 붙잡혀서 가장 기본적인 생각을 하지못해서 발생한 이슈 ,,
기본에 충실하자
'Swift' 카테고리의 다른 글
[Swift] 현재 날짜가 속해있는 주간 날짜 구하기 (0) | 2024.03.05 |
---|