Node.jsでnew Date()で日本の日時が取得できないときの対処法

Node.jsでnew Date()実行時の挙動

Node.jsでは何も設定していなければ、日本のタイムゾーンではなく、システムのタイムゾーン(UTC)を使用します。

そのため、例えば「2023年9月6日 15:00」にnew Date()を実行しても、9時間引かれた「2023-09-06T06:00:00.000Z」が返ってきます。

console.log(new Date())
// 09/06 15:00に実行した場合
// 2023-09-06T06:00:00.000Z

console.log(new Date('2023/09/06 15:00'))
// 2023-09-06T06:00:00.000Z
$ node date.js
2023-09-06T06:00:00.000Z

Node.jsをローカル環境で実行した場合はタイムゾーンが未設定の場合が多いので、これだと問題が発生しやすいです。

もし、日本時間のタイムゾーンで取得したい場合は次の方法で対処できます。

new Date()の場合は9時間を加算する

システムのタイムゾーンは日本時間から9時間減算された日時なので、逆に言うと以下のように9時間加算すれば日本時間になります。

const now = new Date()
const offset = 9 * 60 * 60 * 1000 // 9時間
const japanTime = new Date(now.getTime() + offset)
console.log(japanTime)
// 2023/09/06 15:00に実行した場合
// 2023-09-06T15:00:00.000Z

new Date([日時])の場合は3通りの対処法がある

9時間加算する

new Date([日時])の場合も9時間加算すれば日本時間になります。

const now = new Date('2023/09/06 15:00')
const offset = 9 * 60 * 60 * 1000 // 9時間
const japanTime = new Date(now.getTime() + offset)
console.log(japanTime)
// 2023-09-06T15:00:00.000Z

しかし、new Date([日時])の場合は前述の9時間加算する方法以外にも2つ対処法があります。

UTCを明示的に指定する

new Date()に「2023/09/06 15:00」ではなく「2023-09-06T15:00Z」のようにUTCを明示的に指定すれば、9時間加算しなくても、指定した日時で取得できます。

スラッシュではなくハイフンで区切って、TとZを追加する以下の形式でないと正しく処理されないので注意が必要です。

const now = new Date('2023-09-06T15:00Z')
console.log(now)
// 2023-09-06T15:00:00.000Z

Date.UTCを使用する

Date.UTCで日時を指定するとUTCからの経過時間を返すので、こちらの方法も9時間加算せずに指定した日時で取得できます。

ただし、Date.UTCを使用した場合は「2023/09/06 15:00」形式で指定することはできません。

const now = new Date(Date.UTC(2023, 8, 6, 15, 0, 0))
console.log(now)
// 2023-09-06T15:00:00.000Z

process.env.TZでタイムゾーンを指定

コード内に日本とニューヨークのタイムゾーンの出し分けが必要な場合はprocess.env.TZでタイムゾーンを指定するとコードがわかりやすくなります。

process.env.TZ = 'Asia/Tokyo'
const now = new Date()
let offset = now.getTimezoneOffset() * 60 * 1000
const japanTime = new Date(now.getTime() - offset)
console.log(japanTime)
// 2023/09/06 15:00に実行した場合
// 2023-09-06T15:00:00.000Z

process.env.TZ = 'America/New_York'
offset = now.getTimezoneOffset() * 60 * 1000
const newyorkTime = new Date(now.getTime() - offset)
console.log(newyorkTime)
// 2023/09/06 15:00に実行した場合
// 2023-09-06T02:00:00.000Z

すべてのコードが日本のタイムゾーンの場合は、「npm i dotenv」でdotenvをインストールして、.envファイルに「TZ=Asia/Tokyo」または「JAPAN_OFFSET=32400000」を書いて読み込むと便利です。

# .envファイル設定例
TZ=Asia/Tokyo
JAPAN_OFFSET=32400000
require('dotenv').config()

const now = new Date('2023/09/06 15:00')
const offset = now.getTimezoneOffset() * 60 * 1000
const japanTime = new Date(now.getTime() - offset)
console.log(japanTime)
// 2023/09/06 15:00に実行した場合
// 2023-09-06T15:00:00.000Z
require('dotenv').config()

const now = new Date('2023/09/06 15:00')
const offset = +process.env.JAPAN_OFFSET
const japanTime = new Date(now.getTime() + offset)
console.log(japanTime)
// 2023/09/06 15:00に実行した場合
// 2023-09-06T15:00:00.000Z