node.js에서 기본 시간대를 어떻게 설정합니까?


154

node.js에서 기본 시간대를 어떻게 설정합니까?


2
정말로 그렇게 할 수는 없습니다. 시스템 시간대 설정을 변경하십시오.
thejh

1
thejh가 맞습니다. 시간대를 변경할 수 없습니다. JS 시간 라이브러리 (moment.js와 같은)를 사용하고 대신 시간을 더하거나 빼십시오.
alessioalex

2
가장 쉽고 정확한 방법은 시스템 시간대를 변경하는 것입니다.
Munim

1
유용한 의견이지만 대부분 시스템 관리자가 아닙니다.)
Mário de Sá Vera

답변:


135

이 Google 그룹 스레드 에 따르면 날짜 함수를 호출하기 전에 TZ 환경 변수를 설정할 수 있습니다. 방금 테스트하여 작동합니다.

> process.env.TZ = 'Europe/Amsterdam' 
'Europe/Amsterdam'
> d = new Date()
Sat, 24 Mar 2012 05:50:39 GMT
> d.toLocaleTimeString()
'06:50:39'
> ""+d
'Sat Mar 24 2012 06:50:39 GMT+0100 (CET)'

노드는 이미 환경 변수를 읽었으므로 나중에 시간대를 변경할 수 없습니다.


3
그 흥미 롭군요. 버그 토론은 스레딩에 문제가 있음을 나타냅니다. 그러나 예제는 process.env.TZ를 여러 번 변경하는 것입니다. 처음에 한 번 설정하고 그대로 두는 것처럼 보입니다. 보다 유연하고 강력한 처리를 위해 노드 타임에 대한 참조에 대해 lorancou에게 감사드립니다.
webjprgm

6
슬프게도, 창문에서는 작동하지 않습니다. 맥 OS-X에서 잘 작동 및 유닉스
Ritesh 쿠마르 굽타

15
좋은 대답입니다. 불행히도, 매번 process.env.TZ = 'Europe/Amsterdam' "좋은, 이제 설정할 수있는 모든 유효한 값의 목록을 어디에서 찾을 수 있습니까?" 매번 그것을 찾지 못했습니다.
Rafael Eyng

5
@RafaelEyng the IANA (International Assigned Numbers Association)는 종종 최신 시간대 구성을 제공하는 데 사용됩니다. 최신 시간대 설정은 여기에서 확인할 수 있습니다. ftp.iana.org/tz/tzdata-latest.tar.gz 가능한 시간대 문자열에 대한 개요를 보려면 zone.tab해당 아카이브 의 파일을 확인하십시오 .
JohannesB

8
@RafaelEyng : JohannesB가 언급 한 것처럼 iana.org/time-zones가 공식 소스이지만 데이터 형식은 작동하기 어렵습니다. en.wikipedia.org/wiki/List_of_tz_database_time_zones 에서 작업하는 것이 훨씬 쉽다 는 것을 알았습니다 .IANA 데이터 세트 (현재 2017c 버전)에서 빌드되었습니다.
Peter Rust

66

적어도 Linux 환경에서 저에게 효과적 인 또 다른 접근법은 다음과 같이 Node.js 응용 프로그램을 실행하는 것입니다.

env TZ='Europe/Amsterdam' node server.js

최소한 시간대가 이미 처음부터 올바르게 설정되어 있는지 확인해야합니다.


좋은! 나를 위해 작동
Rotem

문화에도 똑같이 할 수 있습니까?
Jim Aho

이것은 코드에서 시도하는 것보다 시간대를 강제하는 것이 더 간단 합니다 .
Dan Dascalescu

33

다음은 외부 모듈을 사용하지 않고 NodeJ에서 사용자 정의 시간대 날짜 시간을 가져 오는 100 % 작동 예제입니다.

const nDate = new Date().toLocaleString('en-US', {
  timeZone: 'Asia/Calcutta'
});

console.log(nDate);


의아해합니다. 이것은 매우 불쾌하지만 IMO에 중대한 문제가 있습니다. 노드 버전 <13은 'en-us'에 대한 로케일 데이터 만 갖습니다. 즉, 모든 다른 국가에 대해 (일부 경우) 던지거나 잘못된 날짜 형식을 제공합니다. 그리고 대부분의 경우 날짜는 정확 해 보이지만 일과 월이 바뀌 었습니다! 그리고 노드 13은 몇 주 전에 방금 릴리스되었으므로이 문제는 거의 모든 사람에게 적용됩니다.
Tom

아래 @Marshall의 답변은 일부 상황 에서이 문제를 해결할 수있는 방법을 제안합니다 (Lambda 및 기타 FaaS에서는 작동하지 않음).
Tom

31

불행히도 설정 process.env.TZ이 제대로 작동하지 않습니다 기본적으로 변경이 적용되는시기는 미정입니다).

따라서 노드를 시작하기 전에 시스템 시간대를 설정하는 것이 유일한 옵션입니다.

그러나 그렇게 할 수 없으면 노드 시간 을 해결 방법으로 사용할 수 있습니다. 현지 시간 또는 UTC 시간으로 시간을 가져와 원하는 시간대로 변환하십시오. Nodejs에서 시간대 오프셋을 사용하는 방법을 참조하십시오 . 자세한 내용은.


1
npm 모듈 시간이 훌륭했습니다. 나는 utc로 설정 한 다음 utc를 사용하여 모든 시간을 설정하므로 시간대가 다른 다른 컴퓨터간에 코드를 이식 할 수 있습니다.
마크 Shust M.academy에서

더 이상 문제가 없습니까?
Bloke

16

이 솔루션 env TZ='Europe/Amsterdam' node server.js당신은 같은 건물 도구를 사용하여 응용 프로그램을 시작할 때 특별히 갈래의 프로세스와 작업 할 때 @uhef에서이 앱이 갈래의 프로세스 작업을하지 않는 경우에 작동하지만, 꿀꺽 꿀꺽 , 명령이 gulpENV 값을 취할 것입니다 만, 꿀꺽 꿀꺽 만든 과정 아닌 (앱).

이 문제를 해결하려면 다음을 수행해야합니다.

$ export TZ="Europe/Amsterdam"; gulp myTask

이렇게하면 TZ작업중인 콘솔에서 시작된 모든 프로세스에 대해 환경 변수 가 설정 되며 접두사로 export TZ="Europe/Amsterdam";다시 실행할 필요없이 동일한 콘솔에서 gulp 명령 이후에 실행 된 모든 후속 프로세스가 포함 됩니다.


암스테르담에 DST가 있기 때문에 GMT +1에서 "자정 UTC"를 달성하는 데 여전히 바람직한 tz입니까?
FlavorScape

1
@FlavorScape 내가 사용하는 Etc/UTC 특정 오프셋도 Etc있지만 오프셋은 예상 한 것과 반대입니다. Etc/GMT-1UTC + 1 시간입니다. 참조https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk

9

서버 시간대를 설정하고 NTP 동기화를 사용하십시오. 서버 시간을 변경하는 더 좋은 솔루션이 있습니다.

시간대를 나열하려면

timedatectl list-timezones

시간대를 설정하려면

sudo timedatectl set-timezone America/New_York

시간대 확인

timedatectl

서버 및 데이터베이스에 UTC 시간대를 사용하는 것을 선호합니다. 모든 변환은 클라이언트에서 처리해야합니다. 클라이언트 측에서 moment.js를 사용할 수 있습니다.

많은 인스턴스를 유지 관리하기도 쉬울 것입니다.


2
moment.js는 당시에는 훌륭한 라이브러리 였지만 현재 훨씬 더 작은 대안이 있습니다 (예 : date-fns ). 순간은 크다 ; 클라이언트 응용 프로그램에는 권장하지 않습니다.
Dan Dascalescu

5

이 스레드가 매우 오래되었다는 것을 알고 있지만 이것이 나와 같은 Google에서 온 사람에게 도움이 될 것이라고 생각합니다.

GAE Flex (NodeJs)에서는 app.yaml 파일에서 환경 변수 TZ (앱의 모든 날짜 시간대를 관리하는 변수)를 설정할 수 있습니다.

app.yaml

# [START env]
env_variables:
  # Timezone
  TZ: America/Argentina/Buenos_Aires

5

Amazon AWS Elastic Beanstalk에 Node.js 애플리케이션을 배포하는 사람들을위한 답변은 다음과 같습니다. . 나는 다른 곳에서이 문서를 보지 못했다.

에서 Configuration -> Software -> Environment Properties키 값 쌍 TZ과 시간대 (예 America/Los Angeles:)를 설정하고 변경 사항을 적용하십시오.

new Date().toString()Node 앱에서 출력 하고 시간대 접미사에주의 하여 효과를 확인할 수 있습니다 .


3

노드 13 부터는 반복적으로 설정할 수 process.env.TZ있으며 새 Date 객체의 시간대에 반영됩니다. 프로덕션 코드에서 이것을 사용할지 모르겠지만 단위 테스트에 확실히 유용 할 것입니다.

> process.env.TZ = 'Europe/London';
'Europe/London'
> (new Date().toString())
'Fri Mar 20 2020 09:39:59 GMT+0000 (Greenwich Mean Time)'

> process.env.TZ = 'Europe/Amsterdam';
'Europe/Amsterdam'
> (new Date().toString())
'Fri Mar 20 2020 10:40:07 GMT+0100 (Central European Standard Time)'

1
이것은 Linux / Mac에서는 훌륭하지만 Windows에서는 작동하지 않습니다.
네이트

Windows에서도 작동하지 않습니다.set TZ='UTC' node index.js
user3896501

@ user3896501 아니오, 구문 은 OP의 예에서와 같이 실행 중이 아닌 전체 프로세스에 대해 env var를 설정합니다 .
Ian Grainger

2

당신은 순간 시간대 를 취할 수 있습니다 . 위치를 설정하고 일광 절약 시간제를 관리 할 수 ​​있습니다.


2
순간은 이와 같은 작업에 매우 무겁기 때문에 원하는 동작 Date이나 다른 내장 모듈을 통해 원하는 동작을 수행 할 수 없다면 권장하지 않습니다 .
Chris Williamson

2

때로는 다른 곳에서 가상 서버에서 코드를 실행 중일 수 있습니다. NODEJS 또는 다른 특징을 실행할 때 흐릿해질 수 있습니다.

다음은 모든 시간대를 쉽게 사용할 수있는 수정 사항입니다.

시간대 목록은 여기를 확인하십시오.

시간대 문구를 FORMAT 줄의 괄호 안에 넣으십시오.

이 경우 EPOCH를 동부로 변환합니다.

//RE: https://www.npmjs.com/package/date-and-time
const date = require('date-and-time');

let unixEpochTime = (seconds * 1000);
const dd=new Date(unixEpochTime);
let myFormattedDateTime = date.format(dd, 'YYYY/MM/DD HH:mm:ss A [America/New_York]Z');
let myFormattedDateTime24 = date.format(dd, 'YYYY/MM/DD HH:mm:ss [America/New_York]Z');


1

node.js v13 업데이트

@Tom이 지적했듯이 이제 완전한 icu 지원이 v13에 내장되어 있습니다. 따라서 설정 단계를 생략 할 수 있습니다. https://nodejs.org/api/intl.html 런타임에서 icu를 빌드하거나 사용하는 방법을 여전히 사용자 정의 할 수 있습니다.

Windows의 node.js의 경우 다음을 수행 할 수 있습니다.

  1. full-icu가 설치되어 있으면 날짜 로케일이 올바르게 적용됩니다.

    npm i full-icu 또는 전 세계적으로 : npm i -g full-icu

  2. 코드에서 toLocaleString ()을 사용하십시오. 예 :

    new Date().toLocaleString('en-AU', { timeZone: 'Australia/Melbourne' })

    이것은 다음과 같은 것을 생성 할 것이다 : 25/02/2019, 3:19:22 pm. 24 시간을 원하는 경우 'en-GB'는 다음을 생성합니다.25/02/2019, 15:19:22

WEBSITE_TIME_ZONE의 애플리케이션 설정 외에도 node.js를 Azure 웹앱으로 사용하려면 NODE_ICU_DATA를 다음과 같이 설정해야합니다.<your project>\node_modules\full-icu npm i full-icu를 완료 한 후 . 해당 디렉터리는 임시 파일이므로 지울 수 있으므로 Azure에 패키지를 전역으로 설치하는 것은 권장되지 않습니다.

참고 : 1. NodeJS가 날짜 로케일을 올바르게 적용하지 않음

  1. intl 옵션으로 node.js를 만들 수도 있습니다. 자세한 내용은 여기를 참조 하십시오.

1
full-icu는 v13부터 Node의 표준 / 공식 빌드에 포함되므로 위의 단계가 더 이상 필요하지 않습니다.
Tom

1

tzdata 라이브러리를 사용하여 전역 시간대를 구성 할 수 있습니다.

npm install tzdata -y

변수를 사용하여 환경을 설정 한 후 (예 : TZ = America / Bogota)

그리고 프로젝트에서 테스트 :

new Date()

나는 당신이 도움이되기를 바랍니다


1

환경 변수 TZ를 다음과 같이 설정하여 Node.js 프로세스 시간대를 적용 할 수 있습니다.UTC

따라서 모든 시간은 UTC + 00 : 00로 측정됩니다.

전체 목록 : https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

package.json 예제 :

{
  "scripts": {
    "start": "TZ='UTC' node index.js"
  }
}

Windows에서는 작동하지 않습니다. 이 방법으로 TZ env var를 설정할 수 없습니다. TZ를 설정하면 노드의 기본 시간대로 인식되지 않습니다.
네이트

-1

index.js 또는 app.js 또는 main.js와 같은 기본 파일 또는 파일 이름이 무엇이든 환경 변수를 설정하십시오.

process.env.TZ = "Aisa/Tehran";

이것은 전체 노드 응용 프로그램에서 사용될 시간대를 설정합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.