Moment.jsの日付をユーザーのローカルタイムゾーンに変換するにはどうすればよいですか?


84

Moment.jsおよびMoment-Timezoneフレームワークを使用しており、UTCタイムゾーンに明示的にあるMoment.js日付オブジェクトがあります。それをブラウザの現在のタイムゾーンに変換するにはどうすればよいですか?

var testDateUtc = moment.tz("2015-01-30 10:00:00", "UTC"); var localDate = ???

したがって、ユーザーのローカルタイムゾーンを見つけることができれば問題ありません。または、日付オブジェクトを、実際に何であれ、「ローカルタイムゾーン」を使用する別のデータオブジェクトに変換したいと思います。

回答:


139

これにmoment-timezoneを使用する必要はありません。メインのmoment.jsライブラリには、UTCとローカルタイムゾーンを操作するための完全な機能があります。

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).local();

そこから、期待する機能を使用できます。

var s = localDate.format("YYYY-MM-DD HH:mm:ss");
var d = localDate.toDate();
// etc...

オブジェクトである、をコンストラクターに戻すことにより、クローンが作成されることtestDateUtcに注意してください。それ以外の場合は、を呼び出すと、値だけでなく値も変更されます。モーメントは変更可能です。momentmoment().local()testDateUtclocalDate

また、元の入力に+00:00またはなどのタイムゾーンオフセットが含まれている場合は、。を使用しZて直接解析できることにも注意してくださいmoment.utcまたはを使用する必要はありません.local。例えば:

var localDate = moment("2015-01-30T10:00:00Z");

4
この方法ではDSTオフセットが考慮されていないことに注意してください。moment-timezoneライブラリを使用する方が安全です
Jaime Agudo 2015

2
@ジェイムは真実ではありません。 local実際にDSTを考慮に入れています。
マットジョンソン-パイント2015

たとえば、からESTに翻訳するなど、自分で確認できます。CET必要に応じて、明日例を示しますNY-> Madrid。反例を受け入れます:)
Jaime Agudo 2015

1
あなたは正しいですその瞬間は瞬間-タイムゾーンなしでそのタイプの変換を行うことはできません。ただし、UTCとローカルの間で適切に変換できます。これはOPが要求したものです。
マットジョンソン-パイント2015

2
ローカルルールはブラウザから取得されます。ローカルタイムゾーンにDSTが含まれている限り、momentはそれを使用します。
マットジョンソン-パイント2015

23
var dateFormat = 'YYYY-DD-MM HH:mm:ss';
var testDateUtc = moment.utc('2015-01-30 10:00:00');
var localDate = testDateUtc.local();
console.log(localDate.format(dateFormat)); // 2015-30-01 02:00:00
  1. 日付形式を定義します。
  2. モーメントオブジェクトを作成し、オブジェクトのUTCフラグをtrueに設定します。
  3. 元のモーメントオブジェクトから変換されたローカライズされたモーメントオブジェクトを作成します。
  4. ローカライズされたモーメントオブジェクトからフォーマットされた文字列を返します。

参照:http//momentjs.com/docs/#/manipulating/local/


この答えは、おそらくドキュメントを参照して、なぜそれが機能するのかを説明していればさらに良いでしょう。また、あなたは...この答えは月に投稿されたものとは異なる方法を説明することをお勧めします
異端モンキー

@AndrewHenderson、時間はローカルマシンの時間より1時間進んでいますが、なぜ発生するのですか?
Ramesh Papaganti 2017

@RameshPapagantiおそらく夏時間ですか?たとえば、PDTとPST。特にローカリゼーションに関しては、Momentがバージョン間でAPIを変更することが知られています。原因を見つけたら教えてください。
AndrewHenderson 2017

6

これが私がしたことです:

var timestamp = moment.unix({{ time }});
var utcOffset = moment().utcOffset();
var local_time = timestamp.add(utcOffset, "minutes");
var dateString = local_time.fromNow();

{{ time }}UTCタイムスタンプはどこにありますか。


3

utcOffset関数を使用します。

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).utcOffset(10 * 60); //set timezone offset in minutes
console.log(localDate.format()); //2015-01-30T20:00:00+10:00
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.