1

我有一个 C# .Net (4.0) 应用程序,我想根据季节做一些逻辑。此应用程序将由北半球和南半球的人们使用,并且可能会或可能不会在连接到 Internet 的计算机上。

另一个 SO 用户在这里提出了类似的问题,这让我可以根据机器的本地时区信息寻求解决方案。我的 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 遵守夏时制时才有效。这导致:

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

4

1 回答 1

2

如果可用,一个好的方法可能是使用地理定位。这将为连接到 Internet 的用户带来良好的效果。对于未连接到 Internet 的用户,您的时区解决方案可以很好地工作。不幸的是,我认为您将不得不制作一个静态字典来处理不使用夏令时的时区。

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

于 2013-06-18T15:50:34.477 回答