如何使用 javascript 从客户端获取 C# 时区信息类的客户端时区 ID

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

本文关键字:客户端 时区 信息 ID 获取 何使用 javascript      更新时间:2023-09-26

我想从JavaScript获取客户端时区ID来解析c# TimezoneInfo class。并转换为 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时间,则不妨首先使用IANA时区。 野田时间比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转换为本地时间表示是完全可靠的。

我希望它能帮助某人:)