首页 > 解决方案 > 确定给定 lat、long、date 的历史 UTC 偏移量

问题描述

随着时间的推移,一些位置变化已经改变了时区(和 UTC 偏移量) - 肯塔基州路易斯维尔在 1949 年处于 CST (-6) 但目前是 EDT (-4): https ://www.timeanddate.com/time/zone/usa /路易斯维尔?年=1945

大多数 lat/long 库将返回当前时区,但我需要确定历史时区和 utc 偏移量,给定 lat/long 和 UTC 日期。

nodatime(包括 Tzdb Olson 历史数据)是否具有此功能,或者可能与另一个库结合使用?

标签: .nettimezonenodatime

解决方案


您可以结合NodaTimeGeoTimeZone来做到这一点。

using GeoTimeZone;
using NodaTime;

...

static Offset GetOffset(Instant instant, double lat, double lon)
{
    string tzid = TimeZoneLookup.GetTimeZone(lat, lon).Result;
    DateTimeZone tz = DateTimeZoneProviders.Tzdb[tzid];
    return tz.GetUtcOffset(instant);
}

使用您的示例:

Instant instant = Instant.FromUtc(1945, 12, 31, 0, 0);
Offset offset = GetOffset(instant, 38.2527, -85.7585);  // Louisville, KY, USA

Console.WriteLine(offset);  // -06

请记住,结果与数据一样好。IANA tzdb 不保证 1970 年之前日期的准确性。


推荐阅读