JavaScript では時間はnew Date()
などで取得できますが、そのマシンのタイムゾーン設定などからうまく日本時間を取得できない場合があります。
JST が選択可能なマシンの場合
Date#toLocaleString
を使えば大丈夫です。日本時間を取得するにはこれに日本のタイムゾーンであるAsia/Tokyo
を渡して実行します。
new Date().toLocaleString({ timeZone: 'Asia/Tokyo' })
// "3/19/2019, 3:29:58 PM"
これで日本時間の文字列が取得できます。何か触りたい場合は再度これをnew Date()
に渡して使います。
const japanStandardTime = new Date().toLocaleString({ timeZone: 'Asia/Tokyo' });
new Date(japanStandardTime).getHours();
// 15
new Date(new Date().toLocaleString({ timeZone: 'Asia/Tokyo' })).getTime();
// 1552978393000
JST が選択できないマシンの場合
この場合上のように、timeZone: 'Asia/Tokyo'
と設定しても UTC になってしまうようです( AWS Lambda 上など)。その場合は、Date#getTimezoneOffset
を使います。
これは、協定世界時からどれだけ差があるかを分で取得できるメソッドです。例えば日本なら9時間で9 * 60
(540
)分進んでいますから-540
という値が得られます。そして、 UTC なマシンでは0
を取得します。
new Date().getTimezoneOffset();
// -540 JST
// 0 UTC
この差を利用することで、以下のようにするとどちらでも日本時間を取得できます。つまり、 JST の方を0
として扱い、逆に UTC を540
分遅れているという風にして、その分のtime
を現在のtime
に追加してあげるということです。
new Date(Date.now() + ((new Date().getTimezoneOffset() + (9 * 60)) * 60 * 1000));
// どちらで実行しても同じ結果
ライブラリを使う
date-fns-timezone のformatToTimeZone
ユーティリティを使うと楽に取得できます。使うには以下でインストールします。
yarn add date-fns-timezone
# 似たモジュールに date-fns があるが
# 特にそれに依存してる訳ではない模様
import {formatToTimeZone} from 'date-fns-timezone';
const FORMAT = 'YYYY-MM-DD HH:mm:ss';
const TIME_ZONE_TOKYO = 'Asia/Tokyo';
const TIME_ZONE_LONODN = 'Europe/London';
const TIME_ZONE_NEW_YORK = 'America/New_York';
const now = new Date();
console.log(
'東京',
formatToTimeZone(now, FORMAT, {timeZone: TIME_ZONE_TOKYO})
);
console.log(
'ロンドン',
formatToTimeZone(now, FORMAT, {timeZone: TIME_ZONE_LONODN})
);
console.log(
'ニューヨーク',
formatToTimeZone(now, FORMAT, {timeZone: TIME_ZONE_NEW_YORK})
);
formatToTimeZone
の第1引数にはDate
のインスタンス、第2引数にはフォーマット形式の文字列を渡します。このフォーマット形式は date-fns-timezone例date-fns の format ページを参照すると良いです。
第3引数のtimeZone
には取得したい位置のタイムゾーン名を置きます。これはdate-fns-timezone例date-fns の format ページココの List を参照すると良いです。