node.jsでデフォルトのタイムゾーンを設定するにはどうすればよいですか?


153

node.jsでデフォルトのタイムゾーンを設定するにはどうすればよいですか?


2
あなたが本当にそれをすることができないと確信しています。システムのタイムゾーン設定を変更します。
thejh

1
thejhは正しい、タイムゾーンを変更することはできません。JS時間ライブラリ(moment.jsなど)を使用して、代わりに時間を加算/減算します。
alessioalex

2
これを行う最も簡単で正しい方法は、単にシステムのタイムゾーンを変更することです。
Munim 2013年

1
これらは有用なコメントですが、ほとんどの場合、あなたはシステム管理者ではありません;)
MáriodeSáVera 2018

回答:


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)'

ただし、それまでにNodeが環境変数を読み込んでいるため、タイムゾーンを後で変更することはできません。


3
それは面白い。バグの議論は、それがスレッディングに何らかの問題があることを示唆しています。しかし、例としては、process.env.TZを複数回変更しました。最初は一度設定して、そのままにしておけば良いようです。しかし、より柔軟で堅牢な処理のために、ノード時間を参照してくれたlorancouに感謝します。
webjprgm

6
悲しいことに、それはウィンドウズでは機能しません。mac os-xおよびunixで正常に動作します
Ritesh Kumar Gupta

14
素敵な答え。残念ながら、process.env.TZ = 'Europe/Amsterdam' 「いいですね、設定できるすべての有効な値のリストはどこにありますか?」そして、私はいつもそれを見つけません。
Rafael Eyng 2017

5
@RafaelEyng IANA(International Assigned Numbers Association)は、最新のタイムゾーン構成のプロビジョニングによく使用されます。最新のタイムゾーン設定は次の場所にあります:ftp.iana.org/tz/tzdata-latest.tar.gz可能なタイムゾーン文字列の概要については、zone.tabそのアーカイブ内のファイルを確認してください。
JohannesB

8
@RafaelEyng:JohannesBが言及したように、iana.org / time-zonesは公式のソースですが、そのデータ形式は扱いにくいです。IANAデータセット(現在は2017cバージョン)から構築されたen.wikipedia.org/wiki/List_of_tz_database_time_zonesから作業する方がはるかに簡単です。
Peter Rust

66

少なくともLinux環境で私にはうまくいくように思えた別のアプローチは、次のようにNode.jsアプリケーションを実行することです。

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

これにより、少なくとも最初からタイムゾーンが正しく設定されていることが保証されます。


いいね!私のために働く
Rotem

文化についても同じことができますか?
ジム・アホ

これにより、コードでタイムゾーンを強制するよりも、タイムゾーンを強制する方が簡単になりました
Dan Dascalescu

33

以下は、外部モジュールを使用せずにNodeJでカスタムタイムゾーンの日時を取得するための100%機能する例です。

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

console.log(nDate);


私は困惑しています-これは非常に賛成ですが、IMOに重大な問題があります。ノードのバージョンが13未満の場合、 'en-us'のロケールデータのみが含まれます。つまり、他のすべての国に対して(場合によっては)スローするか、間違った日付形式を返します。そして、多くの場合、日付は正しいように見えますが、日と月が入れ替わっています!そして、ノード13はほんの数週間前にリリースされたばかりなので、この問題はほとんどすべての人に当てはまります。
トム

以下の@Marshallの回答は、状況によってはこれを解決する方法を示唆していることがわかります(Lambdaやその他のFaaSでは機能しません)。
トム

31

残念ながら、設定process.env.TZがうまくいかない -基本的に、変更がいつ有効になるかは不定です)。

したがって、ノードを起動する前にシステムのタイムゾーンを設定することが唯一の適切なオプションです。

ただし、それができない場合は、回避策としてノード時間を使用できるはずです。現地時間またはUTC時間で時間を取得し、目的のタイムゾーンに変換します。Nodejsでタイムゾーンオフセットを使用する方法を参照してください詳細については。


1
npmモジュール時間は私にとってはうまくいきました。私はutcに設定し、その後常にutcを使用して設定するため、異なるタイムゾーンの異なるマシン間でコードを移植できます。
Mark Shust、M.academy 2014年

これでもう問題はありませんね。
Bloke

16

ソリューションenv TZ='Europe/Amsterdam' node server.jsあなたが好き構築ツールを使用してアプリを起動したときに、特別に、フォークのプロセスで作業しているとき@uhefからは、あなたのアプリがフォークプロセスで仕事をしない場合には動作しますが、がぶ飲み、コマンドはgulpENV値を取りますが、gulpではなく作成されたプロセス(アプリ)。

これを解決するには、次のことを行う必要があります。

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

これによりTZ、作業中のコンソールで開始されたすべてのプロセスの環境変数が設定され、同じコンソールでgulpコマンドの後に実行された後続のすべてのプロセスが含まれますexport TZ="Europe/Amsterdam";


アムステルダムにはDSTがあるので、これはまだGMT +1で「真夜中のUTC」を達成するのに望ましいtzですか?
FlavorScape 2017年

1
@FlavorScape私が使用するEtc/UTC 特定のオフセットもありますEtcが、オフセットは予想されるものの逆です。 Etc/GMT-1UTC + 1時間です。参照https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk

9

サーバーのタイムゾーンを設定し、NTP同期を使用します。これは、サーバー時間を変更するための1つの優れたソリューションです。

タイムゾーンを一覧表示するには

timedatectl list-timezones

タイムゾーンを設定するには

sudo timedatectl set-timezone America/New_York

タイムゾーンを確認する

timedatectl

サーバーとデータベースにUTCタイムゾーンを使用することを好みます。変換はすべてクライアントで処理する必要があります。クライアント側でmoment.jsを利用できます。

多くのインスタンスを維持することも簡単になります。


2
当時、moment.jsは優れたライブラリでしたが、現在ははるかに小さな代替手段があります(例:date-fns)。モーメントは巨大です。クライアントアプリケーションにはお勧めしません。
Dan Dascalescu

5

私はこのスレッドが非常に古いことを知っていますが、これは私のようにグーグルからここに上陸した人を助けるでしょう。

GAE Flex(NodeJs)では、app.yamlファイルで環境変数TZ(アプリのすべての日付タイムゾーンを管理する変数)を設定できます。ここでは例を示します。

app.yaml

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

5

Node.jsアプリケーションをAmazon AWS Elastic Beanstalkにデプロイする場合の答えは次のとおりです。私はこれが他のどこにも文書化されているのを見たことがありません:

の下Configuration -> Software -> Environment Propertiesで、キー値のペアTZとタイムゾーンなどを設定しAmerica/Los Angeles、変更を適用します。

new Date().toString()Nodeアプリで出力し、タイムゾーンのサフィックスに注意を払うことで、効果を確認できます。


3

Node 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いいえ、その構文はプロセス全体のenv変数を設定します-OPの例のように実行しているときではありません。
イアングレインジャー

2

あなたは瞬間のタイムゾーンを取ることができます。それはあなたがあなたの場所を設定することを可能にし、また夏時間の面倒をみます。


2
このようなタスクの場合、モーメントはかなりDate重いので、または他の組み込みモジュールを介して必要な動作を実行できない場合を除き、私はそれをお勧めしません。
クリスウィリアムソン

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が指摘したように、v13には完全なicuサポートが組み込まれています。したがって、セットアップ手順は省略できます。ランタイムでicuを構築または使用する方法をカスタマイズすることもできます:https ://nodejs.org/api/intl.html

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

Azure Webアプリとしてのnode.jsの場合、WEBSITE_TIME_ZONEのアプリケーション設定に加えて、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の標準/公式ビルドに含まれているため、上記の手順は不要になります。
トム

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.