NodeJS와 date-fns 및 Docker(epoch/unix 형식)를 사용하여 영국 시간 변경(DST) 해결

DST 시간 변경은 특히 타임스탬프를 저장하기 위해 epoch/unix 형식을 사용하는 경우 시간이 한 시간 늦을 수 있는 영국 시간대에 큰 혼란을 일으킬 수 있습니다.

Docker 컨테이너에서 date-fns과 함께 NodeJS를 사용할 때 이 간단한 가이드는 문제를 해결하는 방법을 보여줍니다.
new Date();는 DST와 비교하여 GMT로 시간을 반환할 수 있습니다. 또한 date-fns에서 getUnixTime()를 사용하면 GMT가 될 에포크 타임스탬프가 반환됩니다. 이것을 다시 BST로 변환하는 것은 어려울 수 있습니다.

const { getUnixTime, format } = require("date-fns");

const date = new Date();
console.log('new Date() print',date, '\n');

const unixTime = getUnixTime(date);

const formatted = format(new Date(unixTime * 1000), 'h:mm aa', {
    timeZone: 'Europe/London',
});
console.log('formatted timestamp with timezone', formatted);



위의 코드를 실행하면 터미널의 이 스크린샷에 표시된 대로 올바른 BST에 대해 DST를 고려한 타임스탬프가 제공됩니다.


unixTime * 1000 에 대해 궁금하실 수 있습니다. 이는 date-fnsgetUnixTime()가 밀리초 없이 Unix 타임스탬프를 제공하므로 초로 변환되기 때문입니다.

date-fns format() 함수는 우리가 { timeZone: 'Europe/London', } 를 사용한 이유인 시간대에 대한 세 번째 매개변수를 허용합니다.

도커 컨테이너에서 실행 중이고 여전히 GMT 타임스탬프를 반환하는 경우 docker-compose 파일의 환경 섹션의 일부로 - TZ=Europe/London를 추가하면 컨테이너 시간대를 런던으로 설정하여 문제를 해결하는 데 도움이 됩니다. 아래 예:

test:
    build: ./test
    image: ....
    depends_on:
      - ....
    ports:
      - "1234:1234" # http
      - "1234:1234" # debug
    volumes:
      - ....
      - ....
      - ....
    environment:
      - PORT=....
      - TZ=Europe/London
    command: ....

좋은 웹페이지 즐겨찾기