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 라는 전제로 양쪽 모두 문제 없도록 처리해야 한다.

NutriSync Admin 에서 날짜/시간 처리

  1. DEV, PROD MySQL 은 모두 KST 기준으로 date 를 저장합니다.

  2. db-helper 에서 사용하는 mysql2 패키지는 date 를 UTC 로 변환합니다.

    1. 이 때 timezone 설정이 중요. DB 와 handshake 해서 정보를 받는게 아니라 연결문자열의 timezone을 기준으로 함.
    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)

  3. 서버 컴포넌트, 클라이언트 컴포넌트에서 날짜를 보여 줄 때는 아래 함수를 호출해서 명시적으로 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 로 지정하기만 하면 됨.

  1. DB 에 날짜/시간을 넣을 때는 아래와 같이 timeZone을 명시적으로 KST로 처리한다.
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일을 더하여 내일의 날짜를 얻고, 이를 서울 시간 기준으로 자정으로 맞추는 것