使用时区城市坐标和本地时间的时区转换

Time zone conversion using time zone city coordinates and local time

我正在开发一个日程安排网站,您可以在其中指定日期、时间、时区城市。我想以 UTC 时间将其保存在后端。所以我必须在服务器上以某种方式转换它。我还想提供即时转换为不同时区的功能。

在 Javascript 中,我有一个 date/time 值以及一个时区城市(来自 http://www.citytimezones.info,它给了我地理坐标)。我没有UTC时间,只有指定时区的时间。

现在我需要将这个未来本地时间转换为 UTC。当然,它必须考虑到那时将应用的夏令时偏移量。

此外,我想使用第二时区城市转换为不同的本地时间。

我考虑过使用 Google 地图时区 API,但这会强制您输入 UTC 时间,我没有这个时间,因为我正在尝试计算它。

换句话说,理想情况下我需要一个可以接受这些参数的系统:

并将return转换后的时间。

知道我可以做些什么来实现这一目标吗?

这可以是 Web 服务或 Windows C# 库。

您需要一个时区数据库来执行所需的日期和时间转换。时区比简单的偏移更复杂,因为许多时区都包含夏令时规则。

.NET 框架允许您通过 TimeZoneInfo class. However, you can consider the Windows time zone database proprietary. IANA maintains the Time Zone Database (TZDB) which is described in Best Current Practice (BCP) 175.

使用底层 Windows 时区数据库

Noda Time 支持 TZDB 并提供本地时间戳作为 .NET DateTime 和时区标识符,您可以计算相应的 UTC 时间戳:

var localDateTime = LocalDateTime.FromDateTime(dateTime);
var timeZoneId = "America/New_York"];
var timeZone = DateTimeZoneProviders.Tzdb[timeZoneId];
var zonedDateTime = timeZone.AtLeniently(localDateTime);
var utcDateTime = zonedDateTime.ToDateTimeUtc();

请注意,本地时间戳可能不明确或无效。这发生在本地时钟向后移动(产生歧义)或向前移动(产生无效时间)的夏令时转换期间。 AtLeniently 方法对如何处理歧义和无效时间戳做了一些假设。这可能是您的应用程序中的错误来源。

当您有 UTC 时间戳和时区 ID 时,您可以用类似的方式转换为本地时间:

var instant = Instant.FromDateTimeUtc(utcDateTime);
var timeZone = DateTimeZoneProviders.Tzdb[timeZoneId];
var zonedDateTime = instant.InZone(timeZone);
var localDateTime = zonedDateTime.ToDateTimeUnspecified();

查看 http://www.citytimezones.info/ 后,cities.txt 似乎在最后一列中包含每个城市的 Windows 时区 ID。这使您可以根据城市查找 Windows 时区 ID。

然后您可以使用以下代码将本地 DateTime 转换为 UTC:

var timeZoneId = "Eastern Standard Time";
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
var utcDateTime = TimeZoneInfo.ConvertTimeToUtc(localDateTime, timeZoneInfo);

请注意,如果本地时间戳不明确或无效,ConvertTimeToUtc 将抛出一个 ArgumentException

从UTC到本地时间的逆向转换:

var localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, timeZoneInfo);

将问题分成两部分:

  • 根据位置坐标确定时区
  • 时区之间的时间转换

您会找到多种方法来完成每个操作。

对于第 1 步,您提到了 Google 时区 API 和 CityTimeZones。这两种方法 are listed here,以及其他几种方法。

对于第 2 步,您对 .NET 的选择主要在 Noda Time, or TimeZoneInfo. Martin gave several good examples of each .

之间

此外,考虑到 调度 比大多数情况更困难。您应该阅读 this post 了解更多详情。