繁体   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