簡體   English   中英

如何使用javascript從客戶端獲取c#timezoneinfo類的客戶端時區ID

[英]How to get the client timezone id for c# timezoneinfo class from client side using javascript

我想從 JavaScript 獲取客戶端時區 id 來解析 c# TimezoneInfo 類。並轉換為 utc 時間。我有這個

var timezone = String(new Date());
return timezone.substring(timezone.lastIndexOf('(') + 1).replace(')', '').trim();

問題是它會在一段時間內返回 javascript 時區 CST。 是否有正確的方法來獲取時區 ID

和來自 c#

TimeZoneInfo ZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneIdFromJavascript);
return TimeZoneInfo.ConvertTimeToUtc(Datetime, ZoneInfo);'
  1. TimeZoneInfo使用Windows時區標識符。 它們不會匹配來自 JavaScript 的任何東西。 請閱讀時區標簽維基
  2. 在 JavaScript 中識別用戶的時區是不完美的。 您可以使用這些方法之一進行猜測,但這會給您一個 IANA 時區 ID,而不是 Windows 時區 ID。
  3. 您可以使用我的TimeZoneConverter庫或此處描述的使用Noda Time的方法將 IANA 時區轉換為 Windows 時區。 但是,如果您打算使用 Noda Time,您不妨首先使用 IANA 時區。 Noda Time 比TimeZoneInfo做得更好。
  4. 如果您只想將客戶端的本地時間轉換為 UTC,那么只需在瀏覽器中使用 JavaScript 執行此操作。 然后你不需要知道本地時區實際上是什么。

我發現的最安全的方法是僅使用 UTC 的偏移量而不是標識符名稱。

從 Javascript 我發送這個:

var dateString = new Date();
var offset = dateString.getTimezoneOffset();

在 C# 上,我將此偏移量映射到具有相同偏移量的第一個時區:

string jsNumberOfMinutesOffset = ViewModel.offset;   // sending the above offset
var timeZones = TimeZoneInfo.GetSystemTimeZones();
var numberOfMinutes =  Int32.Parse(jsNumberOfMinutesOffset)*(-1);
var timeSpan = TimeSpan.FromMinutes(numberOfMinutes);
var userTimeZone = timeZones.Where(tz => tz.BaseUtcOffset == timeSpan).FirstOrDefault();

這為我們提供了從客戶端接收到的具有相同偏移量的第一個時區。 由於有多個時區具有相同的偏移量,因此它並不總是與用戶的確切時區匹配,但從 UTC 轉換為本地時間表示是完全可靠的。

我希望它可以幫助某人:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM