지난달 황금같은 강제 연차에 요청이 와서 재택으로 해결했던 건이다.
갑자기 생각이 나서 지금 작성한다.
인수인계 받기 전 새로 개발된 부분에 날짜 선택 중 문제가 있다고 해서 들어가봤다.
내가 하기로는 컴퓨터, 모바일 모두 잘만 굴러갔었다.
근데 여전히 안된다며 보내주신 스크린샷을 봤는데 아이폰을 사용중이신 것 같았다.
그래서 서브로 들고 다니는 아이폰 공기계로 들어가보니 정말 실행되지 않았다..!
// 오늘 날짜 구하기
const today = new Date();
// 특정 날짜 설정
const targetDate = new Date($("[rel=someDate]").text());
기존 코드는 위와 같다.
someDate 부분은 2000.01.01 <- 이와 같은 형태로 값이 들어온다.
상품 판매에 쓰는 기능이었기에 빠른 처리가 필요했던데다 나도 밖에서 노트북으로 작업하던 중이었기에 시간이 없어서 이 문제를 제미나이에게 물어봤다.
제미나이의 답변 :
아이폰(Safari)에서 new Date("YYYY.MM.DD") 형식을 제대로 파싱하지 못하는 경우가 많습니다. 이 형식은 JavaScript 표준 날짜 형식이 아니기 때문이에요.
가장 확실한 방법은 날짜 문자열을 직접 분해해서 new Date(year, monthIndex, day) 형태로 넣어주는 것입니다.
// 오늘 날짜 구하기
const today = new Date();
today.setHours(0, 0, 0, 0);
// 특정 날짜 설정
const someDateString = $("[rel=someDate]").text(); // "YYYY.MM.DD" 형식의 문자열
// "YYYY.MM.DD" 문자열을 파싱하여 Date 객체 생성
const parts = someDateString.split('.'); // ["YYYY", "MM", "DD"]
let targetDate;
if (parts.length === 3) {
const year = parseInt(parts[0], 10)
const month = parseInt(parts[1], 10) - 1;
const day = parseInt(parts[2], 10);
targetDate = new Date(year, month, day);
targetDate.setHours(0, 0, 0, 0);
} else {
console.error("잘못된 날짜 형식입니다:", tripDateString);
targetDate = new Date(today);
}
제미나이의 답변은, 연, 월, 일을 각각 분해해서 넣어주는 것이 정확하다며 위와 같이 코드를 짜주었다.
아마 내가 기존 코드를 최대한 건들지 말고 작성해달라 해서 저런 답변이 나온 것 같다.
지금 찾아보니 해당 문제는 moment.js 등의 라이브러리를 활용하면 된다고 한다.
moment.js로 원하는 날짜 형식 파싱, 출력도 가능하다고 하니 위와 같은 방법보다는 낫지 않을까 싶다.
당시에는 마음이 급해서 일단 이렇게 해결은 했지만...
라이브러리 사용이 가능한 환경이라면 최대한 활용하는 편이 좋을 것 같다.