通过时区城市坐标和当地时间进行时区转换
通过时区城市坐标和当地时间进行时区转换
这个问题已经有了答案:
我正在开发一个调度网站,用户可以指定日期、时间和时区城市。我想在后端将这些内容保存为UTC时间,所以我需要在服务器上进行转换。我还想提供实时转换到另一个时区的功能。
在Javascript中,我有一个日期/时间值以及一个时区城市(来自http://www.citytimezones.info,该网站提供地理坐标)。我没有UTC时间,只有指定时区的时间。
现在,我需要将这个未来的本地时间转换为UTC时间。当然,它必须考虑到那个时刻可能会使用的夏令时偏移量。
此外,我还想使用第二个时区城市将其转换为不同的本地时间。
我考虑过使用Google地图时区API,但这会强制您传入UTC时间,而我没有UTC时间,因为我正在尝试计算它。
换句话说,理想情况下,我需要一个可以接收以下参数的系统:
- 未来的时间/日期
- 源时区城市坐标
- 目的地时区城市坐标(或null = UTC时间)
并返回转换后的时间。
有什么想法可以帮助我实现这个功能吗?
这可以是一个Web服务或一个Windows C#库。
你需要一个时区数据库来执行所需的日期和时间转换。时区比简单的偏移更加复杂,因为许多时区包括夏令时规则。
.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);