我有一个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的静态字典并对它们进行硬编码,但我希望有一种更优雅的方式。
答案 0 :(得分:2)
一种好的方法可能是使用地理位置(如果可用)。这将为连接到互联网的用户带来良好的结果。对于未连接到互联网的用户,您的时区解决方案可以正常运行。不幸的是,我认为你必须制作一个静态字典来处理不使用夏令时的时区。
时区有时会出于任意政治原因而设置,这使得很难以完全统一的方式将它们用于此类事情。