JaveScript/JaveScript
Date객체가 반환하는 시간과 toISOString() 함수의 반환 시간이 다른 문제
알면 알 수록 재밌다!
2023. 11. 6. 13:49
요구사항
년, 월을 입력받으면 입력받은 월에 해당하는 1~말일에 해당하는 레코드를 필터링하고 싶었다.
코드를 작성하고 11월을 선택하고 필터링하니 10월31일부터 조회되는 문제가 발생했다.
문제사항
바로 해보면 아는데, JS에서 기본적으로 리턴해주는 현재 시각은 localtime이고
string으로 변환시킨 시각은 UTC 기준이다.
그래서 9시간의 차이가 난다.
해결방법
dayjs 패키지를 사용해서 현재시간을 리턴하는 코드를 작성했다.
그래서 년, 월을 입력받으면 입력받은 월에 해당하는 1~말일에 해당하는 레코드를 필터링했다.
## dayjsConfig.ts
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.tz.setDefault('Asia/Seoul');
export default dayjs; // dayjs를 기본 내보내기로 설정
해당 코드를 매번 작성하기는 귀찮으니 모듈화시켰다.
import dayjs from '~/libs/dayjsConfig';
let startOfThisMonth: dayjs.Dayjs;
let endOfThisMonth: dayjs.Dayjs;
if (year && month !== undefined) {
startOfThisMonth = dayjs()
.year(year)
.month(month - 1)
.date(1)
.startOf('month'); // 해당 월의 1일 00:00:00
endOfThisMonth = dayjs(startOfThisMonth)
.endOf('month') // 해당 월의 마지막 날 23:59:59
.add(1, 'second');
queryBuilder = queryBuilder.andWhere('announce.createdAt BETWEEN :begin AND :end', {
begin: startOfThisMonth.format(),
end: endOfThisMonth.format(),
});
}
위처럼 1일과 마지막일에 해당하는 레코드를 필터링해서 리턴했다.
참고
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toUTCString