Windows/C#通过操作系统(不是IP地址)检测用户的半球?
Posted
技术标签:
【中文标题】Windows/C#通过操作系统(不是IP地址)检测用户的半球?【英文标题】:Windows/C# Detecting user's hemisphere via OS (not IP address)? 【发布时间】:2013-06-18 13:28:56 【问题描述】:我有一个 C# .Net (4.0) 应用程序,我想根据季节对其进行一些逻辑处理。此应用程序将由北半球和南半球的人们使用,并且可能会或可能不会在连接到 Internet 的计算机上。
另一位 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
我想我可以强制使用时区信息/字符串的静态字典并将它们全部硬编码,但我希望有一种更优雅的方式。
【问题讨论】:
首次启动时无法提示用户是否有特定原因? Logarr - 除了美观之外没有其他原因。从应用程序中得到一个奇怪的问题:“你在哪个半球?”或“你的纬度/经度是多少?”。不过谢谢你的想法! 如果这是一个可能没有互联网连接的桌面应用程序,那么将需要某种用户交互。您可以从可以在本地读取的时区数据中做出最佳猜测,并为用户提供一种覆盖它的方法,并在它不正确时保存他们的偏好。 【参考方案1】:如果可用,一个好的方法可能是使用地理位置。这将为连接到 Internet 的用户带来良好的效果。对于未连接到 Internet 的用户,您的时区解决方案可以很好地工作。不幸的是,我认为您将不得不制作一个静态字典来处理不使用夏令时的时区。
有时会出于任意的政治原因设置时区,这使得很难以完全统一的方式将它们用于此类事情。
【讨论】:
以上是关于Windows/C#通过操作系统(不是IP地址)检测用户的半球?的主要内容,如果未能解决你的问题,请参考以下文章
苹果是不是允许 ios 应用程序通过 IP 地址获取用户位置