2013-12-20 78 views
7

對於oData Rest服務,我使用Moment.js從Unix時間戳創建日期,並且我想忽略時區。 我的日期是「2013-12-24」,在Unix秒內是1387839600。從Unix時間戳創建日期忽略時區

在使用

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

結果 「2013-12-23T23:00:00.000Z」,因爲我住在GMT + 1。 通過使用

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

我得到 「2013-12-24T00:00:00.000Z」 這正是我想要的。我可以簡單地刪除祖魯時間的「Z」結尾。

但我的日期的真實表示是一個Unix時間戳。所以,如果我做

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

我總是得到 「2013-12-23T23:00:00.000Z」,但我想它返回 「2013-12-24T00:00:00.000Z」。

我的錯在哪裏? 感謝您的幫助!

+0

使用 moment.utc一個字符串(力矩( 「1387839600」, 「X」)。格式( 「L」), 「DD.MM.YYYY」)。toISOString() 的作品,但似乎相當複雜!? – Windwalker

+1

或只是'moment(1387839600,'X')。format('YYYY-MM-DDT00:00:00.000')'? – robertklep

+0

謝謝@robertklep,我想接受您的評論作爲我的問題的答案,但不幸的是我無法將您的評論推廣至完整答案... – Windwalker

回答

16

Unix時間戳,無論是以秒還是以毫秒爲單位,都是,始終爲UTC的。價值1387839600確實是2013年12月23日23點UTC。您使用sites like this one進行驗證。

如果您希望它在2013年12月24日UTC的午夜時間,時間戳將爲1387843200

所以時刻表現正確。你應該把注意力集中在你的rest API上,並確保它正確地發出UTC而不是本地時間值。

此外,如果您只是想要日期部分,那麼請不要使用.toISOString。相反,使用.format,例如:

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

您可以'組成'自己的格式。任何需要複製的字符串(不是插值的)都應該包含在括號內。

所以在您的情況,這應該工作:

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

YYYY-MM-DD是有效的ISO日期! http://en.wikipedia.org/wiki/ISO_8601 – laktak

1

不要使用toISOString()。相反,使用這樣的:

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

調整的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