1 回答

TA貢獻1788條經驗 獲得超4個贊
您建議的方法存在缺陷,因為客戶端瀏覽器的當前偏移量僅適用于當前日期和時間。實際上,時區偏移量在給定時區內隨時間變化。您不能僅從一個時間點獲取單一偏移量并期望使用它來將其他日期和時間轉換為同一時區。相反,您需要使用標識時區的字符串,而不是該時區的偏移量。
例如,考慮美國的東部時區。在一年中的部分時間,它使用 UTC-5,我們稱之為東部標準時間 (EST)。在一年中的其他時間,它使用 UTC-4,我們稱之為東部夏令時 (EDT)。這個時區由 IANA time zone ID"America/New_York"
或 Windows time zone ID 標識"Eastern Standard Time"
(涵蓋整個區域,包括 EST 和 EDT,盡管它的措辭)。
所以,把這個問題分解成幾個步驟:
在 JavaScript 中,識別用戶的 IANA 時區 (
America/New_York
):如果你的目標是現代網絡瀏覽器,你可以調用這個函數:
Intl.DateTimeFormat().resolvedOptions().timeZone
如果你需要支持舊的網絡瀏覽器,你可以使用jsTimeZoneDetect,或者
moment.tz.guess()
來自Moment-Timezone。通過您喜歡的任何機制(表單發布、XHR、獲取等)將該字符串發送到您的網絡服務器
在您的 .NET 代碼中,接收該字符串并使用它來引用時區并進行轉換。你有兩個選擇:
您可以使用Noda Time,將 IANA 時區 ID 傳遞給
DateTimeZoneProviders.Tzdb
主頁示例中所示。您可以使用 .NET 的內置
TimeZoneInfo
對象。如果您在非 Windows 系統(Linux、OSX 等)上運行 .NET Core,您只需將 IANA 時區 ID 傳遞給TimeZoneInfo.FindSystemTimeZoneById
. 如果您使用的是 Windows,則需要先將其轉換為 Windows 時區 ID ("Eastern Standard Time"
)。您可以使用TZConvert.GetTimeZoneInfo
我的TimeZoneConverter庫。一旦您擁有
DateTimeZone
Noda Time 或TimeZoneInfo
對象,您就可以使用其上的方法將 UTC 值轉換為該時區的本地時間值。這些中的每一個都將為轉換的時間點應用正確的偏移量。
我還要說,許多應用程序只是要求用戶從下拉列表中選擇他們的時區并將其保存在用戶配置文件中。只要您存儲的是時區標識符字符串而不僅僅是數字偏移量,這種方法完全可以用來替換上面的步驟 1 和 2。
添加回答
舉報