2017-09-27 73 views
0

存儲的日期如下:爲什麼Mongodb中的ISO日期早一天顯示?

... 
"date_of_birth" : ISODate("1920-01-02T00:00:00Z"), 
... 

使用的時刻,它在模型中被格式化(爲了填充輸入用於更新文檔)是這樣的:

AuthorSchema 
    .virtual('date_of_birth_update_format') 
    .get(function(){ 
     // format in JavaScript date format (YYYY-MM-DD) to display in input type="date" 
     return this.date_of_birth ? moment(this.date_of_birth).format('YYYY-MM-DD') : ''; 
    }); 

從檢索收集和顯示,它顯示爲像前一天:

01/01/1920 

我希望有任何幫助來解決這個問題。

+1

你的時區是什麼時區?您可能需要使用'moment-timezone'模塊 – sidgate

回答

0

從mongo的日期總是在格林威治標準時間,並且您的服務器可能在其他時區。格式化之前,您需要將日期轉換爲GMT。

var moment = require("moment-timezone") 

AuthorSchema.virtual('date_of_birth_update_format').get(function(){ 
return this.date_of_birth ? moment(this.date_of_birth).tz('GMT').format('YYYY-MM-DD') : ''; 
}); 
+0

謝謝。由於時刻要求('時刻'),你是說那個時刻 - 時區替代時刻? – JimB814

+0

時刻 - 時區延伸時刻。所以你可以用瞬間時區來代替瞬間使用。你會得到所有的時刻功能 – sidgate

+0

謝謝。我按照你的建議安裝了時間 - 時區並修改了我的代碼,除了我通過了「America/New_York」to tz like this .tz(「America/New_York」)。不幸的是,它仍然顯示1月1日,而不是1月2日,因爲它在數據庫中。 – JimB814

0

ISO 8601格式的Z意味着'GMT',即1920-01-02T00:00:00+0000。時刻將考慮您的時區。如果您在美國大陸,則您的時區偏移量爲-0400 - -0800

1920-01-02T00:00:00Z = 1920-01-01T6:00:00-0600以太平洋標準時間爲例。

+0

謝謝。您是否說我需要修改數據如何保存到Mongodb以反映美國紐約時間? – JimB814

+0

以說話的方式。如果你想代表1920年1月2日在紐約的一天的開始,那麼是的,那將是'1920-01-02T00:00:00-0500'。這看起來像是你的存儲生日,所以如果你想獲得非常技術性的,你可以使用出生地的時區偏移。 –

+0

謝謝。 @ sidgate的解決方案起作用。 – JimB814

0

這取決於你在印度的時區,所以格林尼治標準時間對我來說是+5:30,所以每當我從數據庫檢索我會加起來5:30時間,以便它符合日期和回答爲什麼它存儲前一天,因爲它存儲ISO格式的日期,這就是爲什麼

相關問題