LoginSignup
5
1

More than 1 year has passed since last update.

Node.jsでタイムゾーンを指定する

Posted at

Javascriptのタイムゾーン

最近ではクラウド環境を利用することも多くなり、ローカルはJSTでクラウドはUTCの設定になっていることなどがよくあると思います。
この影響でローカルではうまく動いていたのにデプロイすると日付がちがーう!!!なんてことも・・・
ということで今回はサーバー側にNode.jsを利用していた場合にはタイムゾーンを固定することができるようだったので備忘として残そうと思います。

タイムゾーンの指定

日付を扱うためのnpmライブラリにはMoment.jsdate-fnscdateluxonなど様々なものがあるようです。
正直どれもよくわかってないのですが、、、今回のタイムゾーンを固定するという目的からするとライブラリは使用せずに環境変数TZを指定すれば良さそうです。

Windows対応

Windowsには対応してないよ、みたいな情報ばかりですがしっかり対応されているのでご安心ください!

設定方法

.env
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でも反映されるか確認してみました。
検証用のテストコードはこちら。

date.utils.ts
export class DateUtils {
  static getTimezoneOffset() {
    return new Date().getTimezoneOffset();
  }
}
date.utils.spec.ts
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でのタイムゾーンの指定方法でした。
ドキュメント読めや!ってのはごもっともなですが、それでもやっぱりもっと早く知りたかった・・・・

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1