按国家/地区将历史准确性转换为UTC

时间:2015-02-10 10:21:52

标签: c# .net datetime timezone

我有:

  • 一个国家(例如纳米比亚)
  • 以UTC格式存储的日期时间(比如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)

1 个答案:

答案 0 :(得分:0)

如上所述,我使用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太平洋标准时间
  • 东部标准时间
  • 美国东部标准时间
  • 委内瑞拉标准时间
  • 巴拉圭标准时间
  • 大西洋标准时间
  • 巴西中部标准时间
  • SA西部标准时间
  • Pacific SA标准时间
  • 纽芬兰标准时间
  • 电子。南美标准时间
  • 阿根廷标准时间
  • SA东部标准时间
  • 格陵兰标准时间
  • 蒙得维的亚标准时间
  • 巴伊亚标准时间
  • UTC-02
  • 大西洋中部标准时间
  • 亚速尔群岛标准时间
  • Cabo Verde标准时间
  • 摩洛哥标准时间
  • 协调世界时
  • GMT标准时间
  • 格林威治标准时间
  • W上。欧洲标准时间
  • 中欧标准时间
  • 浪漫标准时间
  • 中欧标准时间
  • W上。中非标准时间
  • 纳米比亚标准时间
  • 乔丹标准时间
  • GTB标准时间
  • 中东标准时间
  • 埃及标准时间
  • 叙利亚标准时间
  • 电子。欧洲标准时间
  • 南非标准时间
  • FLE标准时间
  • 土耳其标准时间
  • 耶路撒冷标准时间
  • 俄罗斯TZ 1标准时间
  • 利比亚标准时间
  • 阿拉伯语标准时间
  • 阿拉伯标准时间
  • 白俄罗斯标准时间
  • 俄罗斯TZ 2标准时间
  • 电子。非洲标准时间
  • 伊朗标准时间
  • 阿拉伯标准时间
  • 阿塞拜疆标准时间
  • 俄罗斯TZ 3标准时间
  • 毛里求斯标准时间
  • 格鲁吉亚标准时间
  • 高加索标准时间
  • 阿富汗标准时间
  • 西亚标准时间
  • 俄罗斯TZ 4标准时间
  • 巴基斯坦标准时间
  • 印度标准时间
  • 斯里兰卡标准时间
  • 尼泊尔标准时间
  • 中亚标准时间
  • 孟加拉国标准时间
  • 俄罗斯TZ 5标准时间
  • 缅甸标准时间
  • 东南亚标准时间
  • 俄罗斯TZ 6标准时间
  • 中国标准时间
  • 俄罗斯TZ 7标准时间
  • 马来半岛标准时间
  • W上。澳大利亚标准时间
  • 台北标准时间
  • 乌兰巴托标准时间
  • 东京标准时间
  • 韩国标准时间
  • 俄罗斯TZ 8标准时间
  • 岑。澳大利亚标准时间
  • AUS中央标准时间
  • 电子。澳大利亚标准时间
  • AUS东部标准时间
  • 西太平洋标准时间
  • 塔斯马尼亚标准时间
  • 马加丹标准时间
  • 俄罗斯TZ 9标准时间
  • 俄罗斯TZ 10标准时间
  • 中太平洋标准时间
  • 俄罗斯TZ 11标准时间
  • 新西兰标准时间
  • UTC + 12
  • 斐济标准时间
  • 堪察加标准时间
  • 汤加标准时间
  • 萨摩亚标准时间
  • Line Islands标准时间

不幸的是,我不确定哪种正式的命名标准/命名约定用于上面列出的值

更新

自从我发布这个答案后,我就采用了Jon Skeet的Nodatime库,这是一个用于处理日期时间概念的优秀库。我强烈推荐它在BCL日期,时间和时间跨度课程上挣扎!