node.jsでデフォルトのタイムゾーンを設定するにはどうすればよいですか?
node.jsでデフォルトのタイムゾーンを設定するにはどうすればよいですか?
回答:
この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が環境変数を読み込んでいるため、タイムゾーンを後で変更することはできません。
process.env.TZ = 'Europe/Amsterdam'
「いいですね、設定できるすべての有効な値のリストはどこにありますか?」そして、私はいつもそれを見つけません。
zone.tab
そのアーカイブ内のファイルを確認してください。
以下は、外部モジュールを使用せずにNodeJでカスタムタイムゾーンの日時を取得するための100%機能する例です。
const nDate = new Date().toLocaleString('en-US', {
timeZone: 'Asia/Calcutta'
});
console.log(nDate);
残念ながら、設定process.env.TZ
がうまくいかない -基本的に、変更がいつ有効になるかは不定です)。
したがって、ノードを起動する前にシステムのタイムゾーンを設定することが唯一の適切なオプションです。
ただし、それができない場合は、回避策としてノード時間を使用できるはずです。現地時間またはUTC時間で時間を取得し、目的のタイムゾーンに変換します。Nodejsでタイムゾーンオフセットを使用する方法を参照してください。詳細については。
ソリューションenv TZ='Europe/Amsterdam' node server.js
あなたが好き構築ツールを使用してアプリを起動したときに、特別に、フォークのプロセスで作業しているとき@uhefからは、あなたのアプリがフォークプロセスで仕事をしない場合には動作しますが、がぶ飲み、コマンドはgulp
ENV値を取りますが、gulpではなく作成されたプロセス(アプリ)。
これを解決するには、次のことを行う必要があります。
$ export TZ="Europe/Amsterdam"; gulp myTask
これによりTZ
、作業中のコンソールで開始されたすべてのプロセスの環境変数が設定され、同じコンソールでgulpコマンドの後に実行された後続のすべてのプロセスが含まれますexport TZ="Europe/Amsterdam";
。
Etc/UTC
特定のオフセットもありますEtc
が、オフセットは予想されるものの逆です。 Etc/GMT-1
UTC + 1時間です。参照https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
サーバーのタイムゾーンを設定し、NTP同期を使用します。これは、サーバー時間を変更するための1つの優れたソリューションです。
タイムゾーンを一覧表示するには
timedatectl list-timezones
タイムゾーンを設定するには
sudo timedatectl set-timezone America/New_York
タイムゾーンを確認する
timedatectl
サーバーとデータベースにUTCタイムゾーンを使用することを好みます。変換はすべてクライアントで処理する必要があります。クライアント側でmoment.jsを利用できます。
多くのインスタンスを維持することも簡単になります。
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)'
set TZ='UTC' node index.js
あなたは瞬間のタイムゾーンを取ることができます。それはあなたがあなたの場所を設定することを可能にし、また夏時間の面倒をみます。
Date
重いので、または他の組み込みモジュールを介して必要な動作を実行できない場合を除き、私はそれをお勧めしません。
他の場所にある仮想サーバーでコードを実行している場合があります-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');
このnpmパッケージunix-system-timezoneを使用します
node.js v13の更新
@Tomが指摘したように、v13には完全なicuサポートが組み込まれています。したがって、セットアップ手順は省略できます。ランタイムでicuを構築または使用する方法をカスタマイズすることもできます:https ://nodejs.org/api/intl.html
Windows上のnode.jsの場合、次のことができます。
full-icuがインストールされている場合はそれをインストールします。これにより、日付ロケールが適切に適用されます
npm i full-icu
またはグローバルに: npm i -g full-icu
コードで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が日付ロケールを適切に適用しない
環境変数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"
}
}
index.jsやapp.jsやmain.jsのようなメインファイルの環境変数を設定するか、ファイル名を指定します。
process.env.TZ = "Aisa/Tehran";
これにより、ノードアプリケーション全体で使用されるタイムゾーンが設定されます