通过时区城市坐标和当地时间进行时区转换

13 浏览
0 Comments

通过时区城市坐标和当地时间进行时区转换

这个问题已经有了答案

DateTime vs DateTimeOffset

我正在开发一个调度网站,用户可以指定日期、时间和时区城市。我想在后端将这些内容保存为UTC时间,所以我需要在服务器上进行转换。我还想提供实时转换到另一个时区的功能。

在Javascript中,我有一个日期/时间值以及一个时区城市(来自http://www.citytimezones.info,该网站提供地理坐标)。我没有UTC时间,只有指定时区的时间。

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

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

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

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

  • 未来的时间/日期
  • 源时区城市坐标
  • 目的地时区城市坐标(或null = UTC时间)

并返回转换后的时间。

有什么想法可以帮助我实现这个功能吗?

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

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

.NET框架允许你使用基础Windows时区数据库,通过使用 TimeZoneInfo 类。然而,你可以考虑Windows时区数据库是专有的。IANA 维护 时间区域数据库(TZDB),在 最佳现行做法(BCP)175 中有描述。

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);

0
0 Comments

将问题分成两个部分:

  • 通过位置坐标确定时区
  • 在不同时区之间进行时间转换

你会发现有几种方法来完成上面的每一步。

对于第一个步骤,你提到了 Google Time Zone API 和 CityTimeZones。这两个方法以及其他几种方法都在这里列出。

对于第二个步骤,几乎只能在.NET中选择 Noda Time 或者 TimeZoneInfo。Martin在他的答案中给出了每种方法的几个很好的例子。

此外,请注意排班是比大多数情况更为困难的场景。你应该阅读这篇文章以获取更多详细信息。

0