1 回答

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