2017-05-04 23 views
2

我的應用程序(C#中的後端#& Angular Materials中的前端)有一個搜索屏幕,允許用戶使用datepickers指定日期時間段。問題是有些用戶不在英國,而他們查看的所有數據都是用GMT日期創建的。所以如果德國的某個人在datepicker中選擇日期01/01/2017,那麼我的後端將其讀爲2016年12月31日23:00:00,導致搜索結果不正確。 有人可以告訴我如何處理這個?我想仍然使用Angular Material datepicker,但要確保我傳遞了用戶選擇的日期。我知道我可以在發佈日期之前改變日期,如下所示: moment(myDate).format('MM/DD/YYYY')) 但我有很多這樣的情況,而且更喜歡一些通用的解決方案。在C中處理js本地化日期#

回答

2

對於傳輸和存儲,我建議使用UTC的一切。只有在顯示點時,時間才能轉換爲用戶選擇的任何區域設置。儘管這是一個老問題,但遇到時間轉換問題仍然很常見。我工作過的大多數地方都會將UTC時間戳或Unix紀元時間存儲爲UTC,這樣毫無疑問系統中任何地方的含義都是一樣的。如果/當它需要渲染到本地時,我們會在客戶端執行。

例如,爲了得到轉換爲UTC作爲一個字符串本地時間:

var noTimeZone = new Date().toUTCString(); 

- 或 -

var noTimeZone = new Date().toISOString(); 

或者,如果你想有一個數值,所以你不必處理客戶機/服務器之間質樸的格式解析,就可以得到Unix紀元:

var unixEpochMS = new Date().getTime(); 

提個醒,Date.getTime()將返回毫秒而不是秒。另請注意,Unix紀元是根據UTC定義的。也就是說,任何時間戳的數字值都是UTC。如果您需要不同的時區,則需要解析該值,然後將時區設置爲所需的時區。

+0

我的代碼是查詢舊的遺留系統,所以我不能改變日期保存的方式。他們都是這樣的:2013-01-26 11:32:33.070。 – johnblack

+0

如果我正確理解您的帖子,則所有數據均以GMT時間存儲。如果是這樣的話,只需在javascript中獲取用戶輸入的UTC時間即可。爲了解決您的問題,GMT和UTC是同義詞。 – jropella

+0

是的,這是正確的,這是我上面提到的解決方案。今天經過幾次測試後,看起來它是解決這個問題的唯一方法。除非有一種方法,我不知道強迫javascript忽略時區,並且在使用Date對象時總是創建UTC/GMT日期。 – johnblack

0

解決方案1: 我認爲解決方案是獲取用戶的時區。您可以使用Javascript從用戶計算機獲取時區,並將其發送到服務器並提出請求。

var d = new Date(); 
var tz = d.getTimezoneOffset()/-60; 

tz2如果用戶的時區是通用汽車+ 2

Soution 2: 您發送和接收Unix時間戳。但是,您需要根據用戶的時區將時間戳轉換爲可讀的日期/時間。

+0

正如我上面提到的,我已經有了臨時解決方案,因爲我可以使用moment(myDate).format('MM/DD/YYYY')將日期作爲格式化字符串傳遞。這種方式當用戶選擇例如Sat Oct 01 2016 00:00:00 GMT + 0100(格林威治標準時間夏令時)在後端我仍然有正確的日期10/01/2016,但我正在尋找一些通用的解決方案。 – johnblack