2013-04-03 81 views
1

服務器日期和服務器時候,我有一個C#的時間應用,用戶可以創建一個定時器並啓動它,它會做這樣的事情在服務器上:顯示在客戶端

(日期將被存儲在CEST(問題是夏季和冬季時間))

// insert into db 
var entry = new TimeEntry(); 
entry.Start = DateTime.Now; (04/03/2013 12:00) 

_timeEntries.Add(entry); // => now it's in the db 

,如果他停止它,然後它做這樣的事情:

// update the entry 
var entry = _timeEntries.Get(1) // 1 is the id from the created entry before 
entry.End = DateTime.Now; (04/03/2013 12:37) 

_timeEntrires.Update(entry); // => now it updates it in the db 

類似的東西會顯示在瀏覽器的用戶:

的timerId:1

開始:2013年4月3日12:00

停止:2013年4月3日12時25分

總金額(分鐘):25

現在我認爲當用戶改變他的時區時會出現一些問題。 解決此問題的最佳方法是什麼?將日期存儲爲UTC,然後使用JavaScript進行轉換?

感謝您的幫助:-)。

+1

_「現在我認爲當用戶改變他的時區時會出現一些問題」_ - 你爲什麼這麼想? – CodeCaster

+0

是否需要在瀏覽器中顯示日期和時間?是否足以顯示像Stackoverflow這樣的操作所用的時間量,例如他們表現出類似於:4分鐘前問。 如果您仍然需要尊重客戶端日期和時間格式,那麼您可以從客戶端HTTP請求獲取本地化信息,然後在服務器上格式化信息。 – Siraf

+0

@CodeCaster因爲日期保存在CEST中,並且用戶有不同的時區,我錯了? –

回答

0

來源:Determine a User's Timezone

你將不得不通過從客戶端偏移到這樣的服務器:)

new Date().getTimezoneOffset()/60; 

使用getTimezoneOffset(從GMT減去您的時間和返回 數分鐘。因此,如果您住在格林威治標準時間8時,它將返回480.要將 這數小時除以60.此外,請注意標記 與您需要的相反 - 它計算GMT從您的 時區的偏移,而不是您的時區與GMT的偏移量。要解決這個問題,只需將 乘以-1。

0

由於這些都是事件發生的時間,您應該嚴格按照UTC工作,並從服務器獲取該值。

當客戶端應用程序調用你無論你使用開始停止輸入命令,使用DateTime.UtcNow()獲得的時間和保存在數據庫中。

你真的不想使用本地時間來記錄這些時間。否則,如果開始或結束處於不明確的時間段內(例如DST/SummerTime「後退」轉換),則無法知道事件是在轉換之前還是之後。

上下文對於DateTime問題總是很重要,在「事件時間」的上下文中,您唯一可靠的選項是UTC DateTime或DateTimeOffset。本地日曆時間(客戶端或服務器)不適合特定的活動時間。不過,它們在其他情況下很有用。當您真正向用戶顯示數據時,如果您只是顯示開始和結束之間的持續時間,則可以根據您記錄的UTC時間進行簡單計算。如果您想要將具體時間顯示回用戶,那麼您需要將UTC時間轉換爲用戶想要顯示的時區。如果選擇DateTimeOffset,則優點是您不必轉換在這個階段。