web-dev-qa-db-ja.com

moment.jsオブジェクトからタイムゾーンを削除する

datetimepicker.js を使用しており、そのdate関数は moment.js オブジェクトを返します。ローカルUTCオフセットを使用してこれを行いますが、元の日付には異なるオフセットがあります。

私の元の日付:

2015-10-01T15:00:00.000Z

日付時刻ピッカーに表示するもの(DD-MM HH:mm):

01-10 15:00

私が得るもの:

2015-10-01T15:40:00+01:00

私が欲しいもの:

2015-10-01T15:40:00+00:00

最後に+01オフセットを削除したことに注意してください。

ローカルUTCに適用するにはどうすればよいですか?これは、01を手動で削除する必要がないためです(ユーザーの場所に応じて他のローカルオフセットになる可能性があるため)。

var momentDate = timePicker.data("DateTimePicker").date();
console.log(momentDate.format());
//this prints  2015-10-01T15:40:00+01:00
29
Alvaro

形式を明示的に指定する必要があります。

これを試して:

momentDate.format('YYYY-MM-DDTHH:mm:ss')

これは結果を与えます

2015-10-01T15:40:00

31
Matt

ユーザーにUTCベースの日付と時刻を選択させようとしているようです。したがって、最初の瞬間を作成するときに、ピッカーをUTCモードで動作させるのが最善の方法です。私はこの特定のdatetimepickerに精通していませんが、内部のどこかで次のようなことをすると仮定します:

_var m = moment([year, month-1, day, hour, minute]);
_

次に、代わりにこれを行う必要があります:

_var m = moment.utc([year, month-1, day, hour, minute]);
_

(ここに表示される変数は、ピッカーコントロール内から取得されます。)

理想的には、ピッカーコントロールには、UTCモードを設定する機能が含まれている必要があります。これにより、ユーザーからの指示があったときに、内部的にこれを行うことができます。

それがそのような機能を持っていない場合、あなたはまだあなた自身を補償することができます。残念ながら、.utc()を呼び出すことはできません。ユーザーが選択した時間とは異なる時間になるためです。そのため、UTC時間を元のモーメントのオフセット分だけシフトすることにより、補正する必要があります。

_var m = // moment value from the picker
var result = moment(m).utc().add(m.utcOffset(), 'm');
_

その後、formatを呼び出すか、結果に任意の名前を付けます。元の瞬間がクローン with moment(m)であり、オフセットが失われず、UTCへの切り替えがピッカーの内部動作を妨げないことに注意してください。

また、このようなshiftingは一般にハックであり、間違って実行するとエラーが発生する可能性があることに注意してください。調整が適用される時点はすでにUTCモードであるため、ここでは問題ありません。しかし、一般的な解決策として、シフトは避ける必要があります。最適なオプションは、最初にコントロールをUTCモードに設定することです。

25

これを試して:

let str = '2015-10-01T15:40+01:00';
let moment = moment(str).utcOffset(str)
console.log(moment.format('DD/MM/YYYY HH:mm'))
<script src="https://momentjs.com/downloads/moment.js"></script>
4
Frofike

これは私のために働いた:

_let date = "2017-02-01 15:20:00.00";
let pattern = "YYYY-MM-DD HH:mm:ss.SS"
let d = moment(date, pattern).utc(false);
_

それはまだタイムゾーンを考慮したと言うでしょうが、私はそうではないと思います。

_LOG: 'ParseDateStr::2017-2-1 15:20:00.0000000
ParsedDate::Wed Feb 01 2017 15:20:00 GMT+0100 (Central European Standard Time)'
_

通常、moment(date, pattern)だけで_16:20:00_として解析されます

3
Wep0n

きれいな解決策ではないが、あなたはできる

momentDate.format('YYYY-MM-DDTHH:mm:ss') + '00:00';

これにより、タイムゾーンが削除され、「00:00」の部分が追加されます。これは、Mattの答えを拡張するためです。

それはあなたに与えるでしょう

2015-10-01T15:40:00 + 00:00

2
Craig

可能な限りシンプル:

let str = "2018-03-20T16:29:35-03:00";
let res = str.substring(0, 19); //2018-03-20T16:29:35
let hi = moment(res).format('LLL')
console.log(hi) //20 de Março de 2018 às 16:29
0