gpt4 book ai didi

c# - 将 UTC 时间转换为实际有效的本地国家时间

转载 作者:行者123 更新时间:2023-12-05 08:51:32 29 4
gpt4 key购买 nike

如果我有一些 UTC 时间,我如何在 C# 中获得相应的波兰本地时间?还是在法国?还是在厄瓜多尔?(我明白这对于像俄罗斯这样使用多次的大国来说没有意义)

在大多数现有示例中,人们使用 TimeZoneInfo 对象:

var zone = TimeZoneInfo.FindSystemTimeZoneById("SE Asia Standard Time");

问题是这还不够。许多国家/地区都有类似“夏令时”或“daylight saving time”之类的东西,它们根据一年中的某一天甚至确切的时间(在时间变化的那一天)使用与 UTC 不同的时间偏移量。

例如,我不知道我是否需要Central Daylight TimeCentral Standard Time 选项,我只知道目标时间是芝加哥。我希望能够有一个字符串让平台为我决定这两个偏移量中的哪一个是正确的。

是否有任何 C# 内置函数可以处理此问题,或者我是否需要根据所选国家/地区的法律自行处理夏令时开始和结束的所有计算?

最佳答案

If I have some UTC time, how do I get in C# the corresponding local time in Poland? Or in France? Or in Equador?

在 Windows 上:

var poland = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTimeOffset.UtcNow, "Central European Standard Time");
var france = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTimeOffset.UtcNow, "Romance Standard Time");
var ecuador1 = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTimeOffset.UtcNow, "SA Pacific Standard Time"); // (Mainland)
var ecuador2 = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTimeOffset.UtcNow, "Central America Standard Time"); // (Galapagos Is.)

在 Linux、OSX 和其他 .NET Core 平台上:

var poland = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTimeOffset.UtcNow, "Europe/Warsaw");
var france = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTimeOffset.UtcNow, "Europe/Paris");
var ecuador1 = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTimeOffset.UtcNow, "America/Guayaquil"); // (Mainland)
var ecuador2 = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTimeOffset.UtcNow, "Pacific/Galapagos"); // (Galapagos Is.)

(注意 Ecuador has two time zones ,一个代表大陆,一个代表加拉帕戈斯群岛。)

确定要使用哪个 Windows ID 的一个很好的引用是 CLDR windowsZones.xml file ,这是 Windows 和 IANA 时区标识符之间转换的真实来源。

(I understand this doesn't make sense for big countries like Russia where many times are used)

的确,俄罗斯有许多不同的时区标识符。人们必须知道他们对俄罗斯的哪一部分感兴趣。

In most the existing examples people use a TimeZoneInfo object:

var zone = TimeZoneInfo.FindSystemTimeZoneById("SE Asia Standard Time");

The problem is that it's not enough. Many countries have something like "summer time" or "daylight saving time", where they use a different time offset to UTC depending on the day of the year and even exact hour (in the day of time change).

For example, rather than knowing whether I need the Central Daylight
Time
or Central Standard Time option, I want to be able to pick America/Chicago and let it handle that for me.

不,这不是问题。您可能对要求感到困惑,因为“标准”一词出现在标识符的名称中。尽管如此,TimeZoneInfo 对象表示整个时区,包括标准时间和夏令时。

需要说明的是,TimeZoneInfo.FindSystemTimeZoneById 方法需要一个标识符。结果对象的 Id 属性将包含该标识符。

  • "America/Chicago" 是一个 IANA 时区标识符。
  • “中央标准时间” 既是 Windows 时区标识符,也是同一时区(在 Windows 上)的英语本地化“标准名称”。
  • “Central Daylight Time” 是该区域(在 Windows 上)的英文本地化“夏令时名称”。它不是有效的时区标识符。

Are there any C# built-in functions that deal with this, or do I need to handle all the calculations where summer time begins and ends according to the law of a chosen country myself?

所有内置计算都会处理这个问题。仅传递有效标识符,框架将确定与 UTC 的正确偏移量,而不管标准时间或夏令时是否有效。

这是一个working example演示了这些概念:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); // Use "America/Chicago" on non-Windows systems

Console.WriteLine("Id: " + tzi.Id);
Console.WriteLine("DisplayName: " + tzi.DisplayName);
Console.WriteLine("StandardName: " + tzi.StandardName);
Console.WriteLine("DaylightName: " + tzi.DaylightName);
Console.WriteLine();

DateTime winterDate = new DateTime(2020, 1, 1);
DateTime summerDate = new DateTime(2020, 7, 1);

TimeSpan winterOffset = tzi.GetUtcOffset(winterDate);
TimeSpan summerOffset = tzi.GetUtcOffset(summerDate);

bool winterIsDst = tzi.IsDaylightSavingTime(winterDate);
bool summerIsDst = tzi.IsDaylightSavingTime(summerDate);

Console.WriteLine("Winter Offset: " + winterOffset + " IsDST: " + winterIsDst);
Console.WriteLine("Summer Offset: " + summerOffset + " IsDST: " + summerIsDst);

输出:

Id:             Central Standard Time
DisplayName: (UTC-06:00) Central Time (US & Canada)
StandardName: Central Standard Time
DaylightName: Central Daylight Time

Winter Offset: -06:00:00 IsDST: False
Summer Offset: -05:00:00 IsDST: True

最后,如果您希望能够在任何操作系统上使用任何一组标识符,您可以通过两种不同的方式来处理:

  • 您可以使用我的 TimeZoneConverter 检索 TimeZoneInfo图书馆。例如:

    // Either of these will work on any platform:
    TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo("America/Chicago");
    TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo("Central Standard Time");
  • 您可以使用 Noda Time而不是 TimeZoneInfo,它具有 Bcl (Windows) 和 Tzdb (IANA) 标识符的 ZonedDateTimeProviders

    // This will work on any platform:
    DateTimeZone dtz = DateTimeZoneProviders.Tzdb["America/Chicago"];

    // This will work with Windows on .NET Framework only
    DateTimeZone dtz = DateTimeZoneProviders.Bcl["Central Standard Time"];

您可能还想阅读 the timezone tag wiki在 Stack Overflow 上。特别是标题为“时区数据库”的部分。

关于c# - 将 UTC 时间转换为实际有效的本地国家时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59686360/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com