日本時間を取得

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-timezoneformatToTimeZoneユーティリティを使うと楽に取得できます。使うには以下でインストールします。

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 の format ページを参照すると良いです。

第3引数のtimeZoneには取得したい位置のタイムゾーン名を置きます。これはココの List を参照すると良いです。