3 回答

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
到目前為止,所有答案的問題在于它們沒有考慮Prashant試圖實(shí)現(xiàn)的目標(biāo)。如果夏令時(shí)更改前一天其系統(tǒng)的用戶的偏移量為+12并為第二天設(shè)置了提醒,則本應(yīng)觸發(fā)該提醒的用戶的偏移量將改為+13。
這就是為什么您只能將當(dāng)前偏移量用于當(dāng)前發(fā)生的事情。盡管我與其他所有人都同意,但服務(wù)器端所有時(shí)間(除了可能僅用于顯示的時(shí)間)都應(yīng)存儲(chǔ)在UTC中。

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
第一件事是確保數(shù)據(jù)位于哪個(gè)時(shí)區(qū)。我建議確保將您存儲(chǔ)的任何DateTime存儲(chǔ)在UTC時(shí)間中(使用DateTime.ToUniversalTime()來保存它)。
當(dāng)要為用戶存儲(chǔ)提醒時(shí),您將需要當(dāng)前的UTC時(shí)間,添加或刪除用戶的時(shí)區(qū)差,然后將新時(shí)間轉(zhuǎn)換回UTC。這就是您要存儲(chǔ)在數(shù)據(jù)庫中的內(nèi)容。
然后,當(dāng)您要檢查要發(fā)送的提醒時(shí),只需根據(jù)UTC時(shí)間在數(shù)據(jù)庫中查找要立即發(fā)送的提醒;本質(zhì)上是獲得所有時(shí)間戳都在之前的提醒DateTime.Now.ToUniversalTime()。
更新一些實(shí)現(xiàn)細(xì)節(jié):您可以從TimeZoneInfo.GetSystemTimeZones()方法中獲取時(shí)區(qū)列表;您可以使用這些時(shí)間顯示用戶的時(shí)區(qū)列表。如果Id從選定的時(shí)區(qū)存儲(chǔ)屬性,則可以從中創(chuàng)建一個(gè)TimeZoneInfo類實(shí)例,并為給定的本地日期/時(shí)間值計(jì)算UTC時(shí)間:
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("<the time zone id>");
// May 7, 08:04:00
DateTime userDateTime = new DateTime(2009, 5, 7, 8, 4, 0);
DateTime utcDateTime = userDateTime.Subtract(tzi.BaseUtcOffset);
- 3 回答
- 0 關(guān)注
- 819 瀏覽
添加回答
舉報(bào)