2016-02-28 99 views
0

我使用FormatJS library along with Handlebars來顯示過去發生的事件列表。我在我的服務器的REST API上調用一個端點,它返回Json中的事件列表,併爲每個事件顯示日期時間。 ATM我使用GMT時區將日期時間保存在數據庫中。使用REST Api和JS時區問題

所以,當我得到我的JSON,我處理日期時間是這樣的:

{{formatRelative commentDate}} 

我的問題是,因爲日期時間在GMT放養,它們也顯示這樣的。例如,因爲我在GMT + 2時區,所以只要創建新事件並顯示在列表中,我就會看到它「在2小時前發生」,而它應該是「幾秒前」。

那麼,有沒有一種方法可以處理這個問題?我在保存日期格林尼治標準時在我的數據庫中犯了錯誤,如果是這樣,你將如何處理來自不同時區的日期時間並將它們顯示給其他時區中的人?

當然,我可以自定義formatRelative幫手與getTimezoneOffset一起玩,並得到想要的結果,但我想知道是否有更好的辦法。

非常感謝!

+1

以UTC爲單位存儲日期通常是首選,因爲它可以簡單地轉換爲任何其他時區。另外,ECMAScript Date對象的核心是UTC。你的問題似乎是關於將「JSON」日期轉換爲本地日期,但是你不會告訴你如何做到這一點。 – RobG

+0

@RobG因爲我沒有轉換任何東西!獲取包含日期時間的Json,格式爲「2016-02-28 10:15:53」 - 這就是UTC時間,直接在'formatRelative'助手中使用它(如圖所示),而不再做任何事情。 –

+1

在體系結構的更多中心部分的世界時間是一個很好的方法:http://currentmillis.com/standard/specification/c/我不認爲你犯概念錯誤,這聽起來像你的抵消失去了某個地方。 http://formatjs.io/handlebars/#formatRelative讓我相信實際上被格式化的時間被定義爲Epoch以來毫秒數的時間,但是我看到你正在返回一個人類可讀的時間。是否有一個約定,服務器返回的時間被解釋爲UTC? (因爲你沒有指定時區,不應該有一個UTC或GMT到底?) – Sandman

回答

1

理解你的問題的關鍵是你在評論中寫道:

獲取JSON,包含格式2016-02-28 10:15:53日期時間 - 這是UTC時間

你應該確保在價值JSON採用完全ISO8601格式,包括相應的偏移量或指示UTC的Z字符:2016-02-28T10:15:53Z

沒有偏移量,大多數實現ations將考慮在當地時間中表示的值,這將解釋您的結果。

因此,問題出在您的服務器端代碼,而不是您的JavaScript代碼。當從JSON中解析日期字符串時,可能會有一種客戶端解決方法,但最好的解決方案是在服務器上對其進行限定。

+0

非常感謝!我會嘗試它,並驗證答案,只要我看到它的工作 –

+0

它完美的作品,謝謝:)我只是想知道爲什麼MySQL不直接在這種格式存儲日期時間,而不是我寫的? –

+1

數據庫(大部分都是)不會將日期時間存儲爲字符串。它們以自定義二進制格式存儲,通常基於自y日期以來x個單元的數量。當您在實用程序中查看它們時,它們可能會被格式化爲字符串,或者在您自己的軟件中使用它們。許多數據庫甚至不會通過本地協議的線路發送字符串。直到你正在消費一種格式適用的消費者。數字也是如此。考慮'1,234.567'。數據庫不存儲逗號或小數點。 –