あるタイムゾーンの日付を別のタイムゾーンに変換する関数を探しています。
2つのパラメータが必要です。
- 日付 (形式: "2012/04/10 10:10:30 +0000")
- タイムゾーン文字列 ("Asia/Jakarta")
タイムゾーン文字列は、http://en.wikipedia.org/wiki/Zone.tab
これを行う簡単な方法はありますか?
ベストアンサー1
ワンライナーは次のとおりです。
function convertTZ(date, tzString) {
return new Date((typeof date === "string" ? new Date(date) : date).toLocaleString("en-US", {timeZone: tzString}));
}
// usage: Asia/Jakarta is GMT+7
convertTZ("2012/04/20 10:10:30 +0000", "Asia/Jakarta") // Tue Apr 20 2012 17:10:30 GMT+0700 (Western Indonesia Time)
// Resulting value is regular Date() object
const convertedDate = convertTZ("2012/04/20 10:10:30 +0000", "Asia/Jakarta")
convertedDate.getHours(); // 17
// Bonus: You can also put Date object to first arg
const date = new Date()
convertTZ(date, "Asia/Jakarta") // current date-time in jakarta.
これはMDNリファレンス。
注意: 上記の関数は、en-US
ロケールでフォーマットされた日付の文字列 ( ) である toLocaleString の結果の解析に依存して動作します"4/20/2012, 5:10:30 PM"
。各ブラウザは、en-US
Date コンストラクターにフォーマットされた日付文字列を受け入れない場合があり、予期しない結果を返す可能性があります (夏時間を無視する場合があります)。
現在、すべての最新ブラウザはこの形式を受け入れ、夏時間を正しく計算しますが、古いブラウザや特殊なブラウザでは動作しない可能性があります。
補足: 最近のブラウザに toLocaleDate 関数があれば、このハッキーな回避策を使わなくても済むので便利です。