我有:
- 一个国家(例如纳米比亚)
- 存储在UTC中的DateTime(假设1955年10月23日下午12:01)
我想编写一个函数,将UTC日期时间转换为纳米比亚当地日期时间,并考虑夏令时,具有历史准确性。
我不能使用时区,因为有些国家实际上会移动时区(例如纳米比亚在冬季属于WAT(UTC+1),在夏季属于WAST(UTC+2)。
有什么CSharp功能可以实现这一点?如果只通过国家的两个字母的国家代码(例如"NA")就可以获得奖励积分。
理想的函数签名应该是:
public static DateTime UtcToLocal(this DateTime UtcDateTime, string CountryCode)
或
public static string UtcToLocal(this DateTime UtcDateTime, string CountryCode)
更新
正如下面的评论部分所指出的,一些国家被绑定到多个时区(例如美国)。因此,方法签名应该如下所示:
public static DateTime UtcToLocal(this DateTime UtcDateTime, string TZ_Environment_ZoneName)
如前所述,我使用TimeZoneInfo类来执行转换。
public static class DateExtenders
{
public static DateTime UtcToLocal(this DateTime UtcDateTime, string TimezoneName)
{
return
TimeZoneInfo.ConvertTimeFromUtc(UtcDateTime, TimeZoneInfo.GetSystemTimeZones().Where(tz => TimezoneName.Equals(tz.StandardName)).Single());
}
}
TimeZoneName的值可以是以下任何值:
- 日期线标准时间
- UTC-11
- 夏威夷标准时间
- 阿拉斯加标准时间
- 太平洋标准时间(墨西哥)
- 太平洋标准时间
- 美国山地标准时间
- 山地标准时间(墨西哥)
- 山地标准时间
- 中美洲标准时间
- 中央标准时间
- 中部标准时间(墨西哥)
- 加拿大中部标准时间
- 南太平洋标准时间
- 东部标准时间
- 美国东部标准时间
- 委内瑞拉标准时间
- 巴拉圭标准时间
- 大西洋标准时间
- 巴西中部标准时间
- 南非西部标准时间
- 太平洋SA标准时间
- 纽芬兰标准时间
- E。南美洲标准时间
- 阿根廷标准时间
- 南非东部标准时间
- 格陵兰标准时间
- 蒙得维的亚标准时间
- 巴伊亚标准时间
- UTC-02
- 大西洋中部标准时间
- 亚速尔群岛标准时间
- 佛得角标准时间
- 摩洛哥标准时间
- 协调世界时
- GMT标准时间
- 格林尼治标准时间
- W。欧洲标准时间
- 中欧标准时间
- 罗曼史标准时间
- 中欧标准时间
- W。中非标准时间
- 纳米比亚标准时间
- 约旦标准时间
- GTB标准时间
- 中东标准时间
- 埃及标准时间
- 叙利亚标准时间
- E。欧洲标准时间
- 南非标准时间
- FLE标准时间
- 土耳其标准时间
- 耶路撒冷标准时间
- 俄罗斯TZ 1标准时间
- 利比亚标准时间
- 阿拉伯标准时间
- 阿拉伯标准时间
- 白俄罗斯标准时间
- 俄罗斯TZ 2标准时间
- E。非洲标准时间
- 伊朗标准时间
- 阿拉伯标准时间
- 阿塞拜疆标准时间
- 俄罗斯TZ 3标准时间
- 毛里求斯标准时间
- 格鲁吉亚标准时间
- 高加索标准时间
- 阿富汗标准时间
- 西亚标准时间
- 俄罗斯TZ 4标准时间
- 巴基斯坦标准时间
- 印度标准时间
- 斯里兰卡标准时间
- 尼泊尔标准时间
- 中亚标准时间
- 孟加拉国标准时间
- 俄罗斯TZ 5标准时间
- 缅甸标准时间
- 东南亚标准时间
- 俄罗斯TZ 6标准时间
- 中国标准时间
- 俄罗斯TZ 7标准时间
- 马来半岛标准时间
- W。澳大利亚标准时间
- 台北标准时间
- 乌兰巴托标准时间
- 东京标准时间
- 韩国标准时间
- 俄罗斯TZ 8标准时间
- Cen。澳大利亚标准时间
- 澳大利亚中部标准时间
- E。澳大利亚标准时间
- 澳大利亚东部标准时间
- 西太平洋标准时间
- 塔斯马尼亚标准时间
- 马加丹标准时间
- 俄罗斯TZ 9标准时间
- 俄罗斯TZ 10标准时间
- 中太平洋标准时间
- 俄罗斯TZ 11标准时间
- 新西兰标准时间
- UTC+12
- 斐济标准时间
- 堪察加标准时间
- 汤加标准时间
- 萨摩亚标准时间
- Line Islands标准时间
不幸的是,我不确定上面列出的值使用了哪种正式的命名标准/命名约定
更新
自从我发布了这个答案后,我就采用了Jon Skeet的Nodatime库,这是一个处理日期时间概念的优秀库。我强烈建议它不要纠结于BCL的日期、时间和时间跨度课程!