确定给定纬度、经度、日期的历史 UTC 偏移量
Determine historical UTC offset given lat, long, date
随着时间的推移,一些位置的变化改变了时区(和 UTC 偏移量)- 肯塔基州路易斯维尔在 1949 年处于 CST (-6),但目前是 EDT (-4):
https://www.timeanddate.com/time/zone/usa/louisville?year=1945
大多数 lat/long 库将 return 当前时区,但我需要确定历史时区和 UTC 偏移量,给定 lat/long 和 UTC 日期。
nodatime(包括 Tzdb Olson 历史数据)是否具有此功能或可能与其他库结合使用?
您可以结合使用 NodaTime and GeoTimeZone。
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 年之前日期的准确性。
随着时间的推移,一些位置的变化改变了时区(和 UTC 偏移量)- 肯塔基州路易斯维尔在 1949 年处于 CST (-6),但目前是 EDT (-4): https://www.timeanddate.com/time/zone/usa/louisville?year=1945
大多数 lat/long 库将 return 当前时区,但我需要确定历史时区和 UTC 偏移量,给定 lat/long 和 UTC 日期。
nodatime(包括 Tzdb Olson 历史数据)是否具有此功能或可能与其他库结合使用?
您可以结合使用 NodaTime and GeoTimeZone。
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 年之前日期的准确性。