我有一个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的用户,您的时区解决方案将工作正常。不幸的是,我认为你必须制作一个静态字典来处理不使用夏令时的时区。
时区有时是出于任意的政治原因设置的,这使得很难以完全统一的方式将它们用于这类事情。

10-08 04:56