Windows / C#通过操作系统(非IP地址)检测用户的半球?

时间:2013-06-18 13:28:57

标签: c# .net windows geolocation

我有一个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的静态字典并对它们进行硬编码,但我希望有一种更优雅的方式。

1 个答案:

答案 0 :(得分:2)

一种好的方法可能是使用地理位置(如果可用)。这将为连接到互联网的用户带来良好的结果。对于未连接到互联网的用户,您的时区解决方案可以正常运行。不幸的是,我认为你必须制作一个静态字典来处理不使用夏令时的时区。

时区有时会出于任意政治原因而设置,这使得很难以完全统一的方式将它们用于此类事情。