Javascriptのタイムゾーン
最近ではクラウド環境を利用することも多くなり、ローカルはJSTでクラウドはUTCの設定になっていることなどがよくあると思います。
この影響でローカルではうまく動いていたのにデプロイすると日付がちがーう!!!なんてことも・・・
ということで今回はサーバー側にNode.jsを利用していた場合にはタイムゾーンを固定することができるようだったので備忘として残そうと思います。
タイムゾーンの指定
日付を扱うためのnpmライブラリにはMoment.jsやdate-fns、cdate、luxonなど様々なものがあるようです。
正直どれもよくわかってないのですが、、、今回のタイムゾーンを固定するという目的からするとライブラリは使用せずに環境変数TZ
を指定すれば良さそうです。
Windows対応
Windowsには対応してないよ、みたいな情報ばかりですがしっかり対応されているのでご安心ください!
設定方法
TZ=UTC
# TZ=Asia/Tokyo
たったこれだけです!
動作確認
UTCとJST(Asia/Tokyo)での動作差分を見てみます。
// UTC
console.log(process.env.TZ);
console.log(new Date().getTimezoneOffset());
// -> UTC
// -> 0
// JST
console.log(process.env.TZ);
console.log(new Date().getTimezoneOffset());
// -> Asia/Tokyo
// -> -540
しっかり反映されていますね。
Jest
ついでにJestでも反映されるか確認してみました。
検証用のテストコードはこちら。
export class DateUtils {
static getTimezoneOffset() {
return new Date().getTimezoneOffset();
}
}
import { DateUtils } from './date.utils';
describe('DateUtils', () => {
it('getTimezoneOffset', () => {
console.log(process.env.TZ);
expect(DateUtils.getTimezoneOffset()).toBe(0);
});
});
実行結果
# UTC
npm run test
# > cognito_authentication@0.0.1 test
# > jest
#
# console.log
# UTC
#
# at Object.<anonymous> (utils/date.utils.spec.ts:5:13)
#
# PASS src/utils/date.utils.spec.ts
# DateUtils
# ✓ getTimezoneOffset (11 ms)
#
# Test Suites: 1 passed, 1 total
# Tests: 1 passed, 1 total
# Snapshots: 0 total
# Time: 0.819 s, estimated 1 s
# Ran all test suites.
# JST
npm run test
# > cognito_authentication@0.0.1 test
# > jest
#
# console.log
# Asia/Tokyo
#
# at Object.<anonymous> (utils/date.utils.spec.ts:5:13)
#
# FAIL src/utils/date.utils.spec.ts
# DateUtils
# ✕ getTimezoneOffset (13 ms)
#
# ● DateUtils › getTimezoneOffset
#
# expect(received).toBe(expected) // Object.is equality
#
# Expected: 0
# Received: -540
#
# 4 | it('getTimezoneOffset', () => {
# 5 | console.log(process.env.TZ);
# > 6 | expect(DateUtils.getTimezoneOffset()).toBe(0);
# | ^
# 7 | });
# 8 | });
# 9 |
#
# at Object.<anonymous> (utils/date.utils.spec.ts:6:43)
#
# Test Suites: 1 failed, 1 total
# Tests: 1 failed, 1 total
# Snapshots: 0 total
# Time: 0.873 s, estimated 1 s
# Ran all test suites.
バッチリですね!
終わりに
ということでNode.jsでのタイムゾーンの指定方法でした。
ドキュメント読めや!ってのはごもっともなですが、それでもやっぱりもっと早く知りたかった・・・・