web-dev-qa-db-ja.com

Moment.jsを使用して時間文字列を解析し、タイムゾーン情報を無視する方法はありますか?

タイムゾーンの質問が大量にあるので、この問題の答えを見つけることができると思いましたが、成功しませんでした。

moment.jsを使用してISO-8601文字列を解析する方法はありますが、ローカルのtimzeoneで解析する方法はありますか?基本的に、ISO文字列で提供されるタイムゾーン情報を無視します。

たとえば、EDTタイムゾーンにいる場合:

var x = moment( "2012-12-31T00:00:00+0000" );

「2012-12-30T19:00:00-5000」と表示されます

私はタイムゾーン情報を無視して、 "2012-12-31T00:00:00-5000"現地時間(EDT)に相当する瞬間を私に与えたいと思っています。

18
Eric B.

ignoreオフセットを本当にしたいとは思わない。これは最終的に、提供したオフセットをローカルタイムゾーンのオフセットに置き換えるだけであり、完全に異なる瞬間になります。

たぶん、与えられたタイムゾーンを保持する方法を探しているだけでしょうか?その場合は、moment.parseZone関数を使用してください。例えば:

var m = moment.parseZone("2012-12-31T00:00:00+0000");
var s = m.format();   // "2012-12-31T00:00:00+00:00"

moment.utcでもこれを実現できます。違いは、moment.parseZoneは指定されたオフセットを保持しますが、moment.utcはゼロ以外のオフセットを指定するとUTCに調整されます。

11

formatを2番目の引数として指定し、モーメントの エスケープ文字 のメソッドを使用して角括弧を囲むことでこれを解決しましたタイムゾーン。

moment("2016-01-01T05:00:00-05:00", "YYYY-MM-DDTHH:mm:ss[Z]").startOf("hour").format()

これでもローカルタイムゾーンを使用してモーメントオブジェクトが作成されますが、自動タイムゾーンの計算は行われません。したがって、上記の例では、提供されたタイムゾーンに関係なく、午前5時が得られます。

10
Mark

私はパーティーに遅れていることを知っています。同じ質問があり、検索しても近づきませんでした。私は故障してドキュメントを読みましたが、現時点では文字列+形式のオプションがあります。

文字列+形式ドキュメント

モーメント(文字列、文字列);

モーメント(文字列、文字列、文字列);

moment(String、String、Boolean);

moment(String、String、String、Boolean);

そしてより多くの言葉、そしてこれ:

タイムゾーンのオフセットを指定しない限り、文字列を解析すると現在のタイムゾーンで日付が作成されます。

moment("2010-10-20 4:30",       "YYYY-MM-DD HH:mm");   // parsed as 4:30 local time
moment("2010-10-20 4:30 +0000", "YYYY-MM-DD HH:mm Z"); // parsed as 4:30 UTC

一時停止を与えた部分は、現地時間の解析に使用された+0000を省略した例でした。そのため、入力文字列はそれを削除する必要があると思いましたが、実際はそうではありません。

例:

var time = "2012-12-31T00:00:00+0000";
var x = moment(time); // Sun Dec 30 2012 19:00:00 GMT-0500
var y = moment(time,'YYYY-MM-DD'); //Mon Dec 31 2012 00:00:00 GMT-0500
5
vrtis

入力文字列が確実にISO-8601形式であることがわかっている場合は、最後の5桁を取り除いて、それをモーメントコンストラクタで使用できます。

var input = "2012-12-31T00:00:00+0000"
input = input.substring(0, input.length-5)
moment(input).toString()
> "Mon Dec 31 2012 00:00:00 GMT-0600"
3
khalid13

moment.utc()の代わりにmoment()を使用して新しい瞬間を作成することにより、ブラウザのタイムゾーンを完全に無視できます。

たとえば、ブラウザの現在時刻のUTC日付/時刻を純粋に処理しようとしているが、そのタイムゾーンデータを破棄したい場合は、以下を使用してブラウザの現在時刻をUTC形式に再作成できます。

_let nowWithTimezone = moment();
let nowInUtc = moment.utc(nowWithTimezone.format('MM/DD/YYYY HH:mm'), 'MM/DD/YYYY HH:mm');
_

moment.utc()に関する詳細ドキュメント: https://momentjs.com/docs/#/parsing/utc/

2
Steven

OPが求めていることを行う正当な理由があります。これをMomentで行う最も簡単な方法は、parseZone(date)メソッドを使用することです。文字列操作や複数の呼び出しで混乱することはありません。ブラウザーのローカルタイムゾーンにあるかのように、日付文字列を効果的に解析します。

2
pmont

最善の方法は、以下を使用することです。

dt = moment("Wed Sep 16 2015 18:31:00 GMT-0400", "ddd MMM DD YYYY HH:mm:ss GMT-0400",true);

そして、希望するタイムゾーンに再度変換して表示するには:

 dt.utcOffset("-04:00").toString()
 output > Wed Sep 16 2015 18:31:00 GMT-0400
0
Thomas Modeneis

Momentjsのデフォルトロジックは、指定された時間をローカルタイムゾーンでフォーマットします。元の日付をフォーマットするために、私は関数を書きました:

https://github.com/moment/moment/issues/2788#issuecomment-321950638

0
frustigor

これはMomentJSで行うのが難しいタスクです。基本的には現在のタイムゾーンにも依存します。

ドキュメントもこの特定のタスクについては曖昧です。私が私の側で問題を解決した方法は、JSON形式に変換する前に日付に時間を追加することでした。

var dt = moment("Sun Sep 13 2015 00:00:00 GMT-0400", "ddd MMM DD YYYY HH:mm:ss GMT-0400", false);
var date = dt.add(2, 'hour').toJSON();
console.log(date); //2015-09-13T00:00:00.000Z
0
Thomas Modeneis