web-dev-qa-db-ja.com

タイムゾーンを無視してUnixタイムスタンプから日付を作成する

OData Restサービスの場合、Moment.jsを使用してUnixタイムスタンプから日付を作成しますが、タイムゾーンを無視したいと思います。私の日付は「2013-12-24」で、Unix秒で1387839600です。

使用する

moment("2013-12-24", "YYYY-MM-DD").toISOString()

私はGMT + 1に住んでいるので、結果は「2013-12-23T23:00:00.000Z」になります。の使用によって

moment.utc("2013-12-24", "YYYY-MM-DD").toISOString()

「2013-12-24T00:00:00.000Z」が表示されます。これはまさに私が欲しいものです。最後にZulu時間の「Z」を簡単に削除できます。

しかし、私の日付の実際の表現はUnixタイムスタンプです。だから私がそうするなら

moment.utc(1387839600, "X").toISOString()

常に「2013-12-23T23:00:00.000Z」を取得しますが、「2013-12-24T00:00:00.000Z」を返します。

私のせいはどこですか?ご協力いただきありがとうございます!

9
Windwalker

Unixタイムスタンプは、秒単位かミリ秒単位かに関係なく、UTCでは常にです。値1387839600は確かに2013-12-23の11:00 PM UTCです。確認には このようなサイト を使用します。

UTCの深夜に2013-12-24にする場合、タイムスタンプは1387843200になります。

したがって、瞬間は正しく動作しています。代わりに、REST APIに焦点を合わせ、現地時間の値ではなくUTCを正しく出力していることを確認する必要があります。

また、日付部分だけが必要な場合は、.toISOStringを使用しないでください。代わりに、次のような.formatを使用してください。

moment.utc(1387843200, 'X').format('YYYY-MM-DD')
16

独自のフォーマットを「作成」することができます。そのままコピーする必要がある(補間されない)文字列は、角かっこで囲む必要があります。

したがって、あなたの状況では、これはうまくいくはずです:

moment(1387839600, 'X').format('YYYY-MM-DD[T00:00:00.000]')
5
robertklep

OnChange機能を調整した後、

_<DateTimeField mode="date" inputFormat='MM-DD-YYYY' onChange= {this.onChange} />_

OnChange関数は次のようになります。

onChange: function(value) { console.log({myDate: moment.utc(value, 'x').format('YYYY-MM-DDTHH:mm:ss.SSSZ')}); },

混乱が生じた場合に備えて、onChange値はUnixタイムスタンプ(X)ではなくUnixミリ秒タイムスタンプ(x)として入力されるようです。

これにより、_2015-07-15T15:02:00.000+00:00_のような文字列が出力されます。

3
jenmbq

toISOString()は使用しないでください。代わりに、次のようなものを使用してください。

moment.utc(1387839600, "X").utcOffset(1).format('YYYY-MM-DD') + "[T" + moment.utc(1387839600, "X").utcOffset(1).format('HH:mm:ss.000]')
1
Laoyuan