UTC(협정 세계시)와 KST(한국 표준시)는 서로 다른 타임존입니다.
UTC는 세계적으로 표준 시간의 기준이 되는 시간이며, KST는 UTC보다 9시간 빠릅니다. 예를 들어, UTC가 자정일 때 KST는 오전 9시입니다.
자바스크립트의 new Date 는 UTC를 기준으로 합니다. 참고 - https://nyagm.tistory.com/205
AWS Amplify 에서는 시스템 타임존은 항상 UTC 이며, 환경변수나 next.config.mjs 에 TZ 설정을 해도 변하지않는다. 따라서 로컬은 KST, 서버는 UTC 라는 전제로 양쪽 모두 문제 없도록 처리해야 한다.
DEV, PROD MySQL 은 모두 KST 기준으로 date 를 저장합니다.
db-helper 에서 사용하는 mysql2 패키지는 date 를 UTC 로 변환합니다.
const dbConfig = {
host: process.env.DB_HOST,
port: Number(process.env.DB_PORT),
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
multipleStatements: true,
waitForConnections: true,
connectionLimit: 5,
queueLimit: 0,
**timezone: '+09:00',**
};
예) timezone 설정을 하지 않으면 서버 시스템 타임존을 따릅니다. (local)
서버 컴포넌트, 클라이언트 컴포넌트에서 날짜를 보여 줄 때는 아래 함수를 호출해서 명시적으로 UTC 시간을 KST 로 변환한다.
export const formatDateToLocal = (utcDateStr: string, locale = 'ko-KR') => {
// UTC 문자열을 명시적으로 파싱
const utcDate = new Date(utcDateStr);
const options: Intl.DateTimeFormatOptions = {
day: 'numeric',
month: 'short',
year: 'numeric',
hour: 'numeric',
minute: 'numeric',
hour12: false,
**timeZone: 'Asia/Seoul',**
};
return new Intl.DateTimeFormat(locale, options).format(utcDate);
};
이미 mysql2가 날짜/시간을 UTC 로 변환했기 때문에 Intl.DateTimeFormatOptions 에 timeZone을 Asia/Seoul 로 지정하기만 하면 됨.
export const spCallDate = () => new Date().toLocaleString('af-ZA', { **timeZone: 'Asia/Seoul'** });
ETC
. day.js를 이용한 어느상황에서나 똑같은 시간을 지정하는 방법.
const tmr = dayjs(new Date()).add(1, 'day') // 현재 날짜에 1일을 더함 [내일의 날짜를 구함]
tmr.tz('Asia/Seoul').startOf('day').toDate() // 서울시간으로 변한, 자정(00:00설정), javascript의 date객체로 변환
→ 결론적으로, 현재 날짜에서 1일을 더하여 내일의 날짜를 얻고, 이를 서울 시간 기준으로 자정으로 맞추는 것