我有一个c.net(4.0)应用程序,我想根据季节做一些逻辑分析。这个应用程序将被北半球和南半球的人们使用,并且可能在连接到互联网的机器上,也可能不在机器上。
另一个so用户提出了类似的问题here,这让我可以根据机器的本地时区信息寻求解决方案。我的javascript到c的“端口”大致如下:
TimeZoneInfo tzi = TimeZoneInfo.Local;
TimeSpan january = tzi.GetUtcOffset(new DateTime(System.DateTime.Now.Year, 1, 1));
TimeSpan july = tzi.GetUtcOffset(new DateTime(System.DateTime.Now.Year, 7, 1));
TimeSpan diff = january - july;
if (diff.TotalDays > 0)
{
Console.WriteLine(tzi.DisplayName + " is in the Southern hemisphere");
}
else
{
Console.WriteLine(tzi.DisplayName + " is in the Northern hemisphere");
}
我的机器的时区恰好在北半球,并且正确地输出:
(UTC-06:00)中部时间(美国和加拿大)在北半球
如果我换线:
TimeZoneInfo tzi = TimeZoneInfo.Local;
我知道时区在南半球,所以看起来也很有希望:
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Cen. Australia Standard Time");
输出:
(UTC+09:30) Adelaide is in the Southern hemisphere
到现在为止,一直都还不错。但是这个技巧只有在timezoneinfo observes daylight savings time的情况下才有效。从而导致:
> (UTC+09:30) Adelaide is in the Southern hemisphere
> (UTC+09:30) Darwin is in the Northern hemisphere
> (UTC+10:00) Brisbane is in the Northern hemisphere
> (UTC+10:00) Canberra, Melbourne, Sydney is in the Southern hemisphere
我想我可以强制使用一个静态的timezoneinfo/string字典并对它们进行硬编码,但我希望有一种更优雅的方法。
最佳答案
一个好的方法可能是使用地理定位(如果有的话)。这将为连接到Internet的用户带来一个好的结果。对于没有连接到Internet的用户,您的时区解决方案将工作正常。不幸的是,我认为你必须制作一个静态字典来处理不使用夏令时的时区。
时区有时是出于任意的政治原因设置的,这使得很难以完全统一的方式将它们用于这类事情。