Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将UTC时间转换为实际有效的当地国家/地区时间_C#_.net_Datetime_Timezone - Fatal编程技术网

C# 将UTC时间转换为实际有效的当地国家/地区时间

C# 将UTC时间转换为实际有效的当地国家/地区时间,c#,.net,datetime,timezone,C#,.net,Datetime,Timezone,如果我有一些UTC时间,我如何使用C#波兰相应的当地时间?还是在法国?还是在厄瓜多尔? (我理解这对于像俄罗斯这样的大国来说是没有意义的,因为在这些国家,很多次都被使用) 在大多数现有示例中,人们使用TimeZoneInfo对象: var zone = TimeZoneInfo.FindSystemTimeZoneById("SE Asia Standard Time"); var zone = TimeZoneInfo.FindSystemTimeZoneById("SE Asia Stan

如果我有一些UTC时间,我如何使用C#波兰相应的当地时间?还是在法国?还是在厄瓜多尔? (我理解这对于像俄罗斯这样的大国来说是没有意义的,因为在这些国家,很多次都被使用)

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

var zone = TimeZoneInfo.FindSystemTimeZoneById("SE Asia Standard Time");
var zone = TimeZoneInfo.FindSystemTimeZoneById("SE Asia Standard Time");
问题是这还不够。许多国家都有类似于“夏季时间”或“”的内容,根据一年中的哪一天,甚至是准确的小时数(在时间变化的那一天),它们使用不同的UTC时间偏移量

例如,我不知道是否需要
中央夏时制
中央标准时间
选项,而只知道目标时间是芝加哥时间。我希望能够有一个字符串,让平台现在为我决定这两个偏移中哪一个是正确的


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

夏令时之类的事情会根据日期变化。因此,如果使用时区转换时间,则必须提供要转换的完整日期时间,并且.NET将负责计算DST是否处于活动状态并进行适当的计算

下面的例子强调了这一点:亚利桑那州和犹他州在美国处于“山区时间”,但亚利桑那州不像美国大多数州那样遵守夏令时。所以在冬季,这两个时区具有相同的偏移量,但在夏季,它们具有不同的偏移量

var arizona = TimeZoneInfo.FindSystemTimeZoneById("US Mountain Standard Time");
var utah = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
var time1 = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var time2 = new DateTime(2020, 7, 1, 0, 0, 0, DateTimeKind.Utc);
Console.WriteLine(TimeZoneInfo.ConvertTime(time1, arizona).ToString());
Console.WriteLine(TimeZoneInfo.ConvertTime(time1, utah).ToString());
Console.WriteLine(TimeZoneInfo.ConvertTime(time2, arizona).ToString());
Console.WriteLine(TimeZoneInfo.ConvertTime(time2, utah).ToString());
输出:

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
2019年12月31日下午5:00:00
2019年12月31日下午5:00:00
2020年6月30日下午5:00:00
2020年6月30日下午6:00:00

注意:自从我第一次看到你的问题后,Joel Coehoorn补充了以下内容:

例如,我不想知道我是否需要
中央夏时制
中央标准时间
选项,而是希望能够选择
美国/芝加哥
,让它来为我处理


我不知道这是否是你问题的目的。如果是的话,.

像夏令时这样的事情会根据日期而变化。因此,如果使用时区转换时间,则必须提供要转换的完整日期时间,并且.NET将负责计算DST是否处于活动状态并进行适当的计算

下面的例子强调了这一点:亚利桑那州和犹他州在美国处于“山区时间”,但亚利桑那州不像美国大多数州那样遵守夏令时。所以在冬季,这两个时区具有相同的偏移量,但在夏季,它们具有不同的偏移量

var arizona = TimeZoneInfo.FindSystemTimeZoneById("US Mountain Standard Time");
var utah = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
var time1 = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var time2 = new DateTime(2020, 7, 1, 0, 0, 0, DateTimeKind.Utc);
Console.WriteLine(TimeZoneInfo.ConvertTime(time1, arizona).ToString());
Console.WriteLine(TimeZoneInfo.ConvertTime(time1, utah).ToString());
Console.WriteLine(TimeZoneInfo.ConvertTime(time2, arizona).ToString());
Console.WriteLine(TimeZoneInfo.ConvertTime(time2, utah).ToString());
输出:

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
2019年12月31日下午5:00:00
2019年12月31日下午5:00:00
2020年6月30日下午5:00:00
2020年6月30日下午6:00:00

注意:自从我第一次看到你的问题后,Joel Coehoorn补充了以下内容:

例如,我不想知道我是否需要
中央夏时制
中央标准时间
选项,而是希望能够选择
美国/芝加哥
,让它来为我处理

我不知道这是否是你问题的目的。如果是

有没有处理这个问题的C#内置函数

不幸的是,没有

我是否需要根据所选国家的法律处理夏季开始和结束的所有计算

谢天谢地,也没有。有一个高质量的开源库,你可以使用它,你可以通过

不过,这确实要求您能够找到每个位置的正确名称(请参阅链接中表格中的“Tz数据库名称”列)

有没有处理这个问题的C#内置函数

不幸的是,没有

我是否需要根据所选国家的法律处理夏季开始和结束的所有计算

谢天谢地,也没有。有一个高质量的开源库,你可以使用它,你可以通过

不过,这确实要求您能够找到每个位置的正确名称(请参阅链接中表格中的“Tz数据库名称”列)

如果我有一些UTC时间,我如何使用C#波兰相应的当地时间?还是在法国?还是在厄瓜多尔

在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核心平台上:

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.)
(请注意,一个用于大陆,一个用于加拉帕戈斯群岛。)

确定要使用哪个Windows ID的一个很好的参考是,它是在Windows和IANA时区标识符之间转换的真实来源

// 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"];
(我理解这对于像俄罗斯这样的大国来说是没有意义的,因为在这些国家,很多次都被使用)

事实上,俄罗斯有许多不同的时区标识符。人们必须知道他们对俄罗斯的哪个地区感兴趣

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

var zone = TimeZoneInfo.FindSystemTimeZoneById("SE Asia Standard Time");
var zone = TimeZoneInfo.FindSystemTimeZoneById("SE Asia Standard Time");
问题是这还不够。许多国家都有自己的特色 比如“夏季”或“夏季”,在那里 根据一年中的日期,使用不同的UTC时间偏移 甚至是准确的时间(在时间变化的当天)

例如,我不知道是否需要
中央日光
时间
中央标准时间
选项,我希望能够选择
America/Chicago
让它来帮我处理

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

为了澄清这一点,
TimeZoneInfo.FindSystemTimeZoneById
方法采用标识符。结果对象的
Id