2015-02-10 125 views
0

UTC转换为本地与历史悠久的准确性,我有:按国家

  • 一个国家(例如纳米比亚)
  • 一个DateTime存储在UTC(比方说,1955年10月23日下午12:01)

我想编写一个函数,将UTC日期时间转换为具有历史精确度的当地纳米比亚日期时间,并考虑到夏令时。

我不能使用的时区,因为一些国家实际移动时区(纳米比亚比如冬季和沃斯特(夏季UTC + 2)在WAT(UTC + 1)下下降。

任何CSHARP功能,可以实现这一点?加分,如果这可以只透过国家的两个字母的国家代码(例如“NA”)来实现

理想的函数签名应该是:

public static DateTime UtcToLocal(this DateTime UtcDateTime, string CountryCode) 

public static string UtcToLocal(this DateTime UtcDateTime, string CountryCode) 

UPDATE

正如下面的评论部分中指出,一些国家也必然多个时区(美国为例)。因此,该方法的签名而应如下所示:

public static DateTime UtcToLocal(this DateTime UtcDateTime, string TZ_Environment_ZoneName) 
+0

http://stackoverflow.com/questions/179940/convert-utc-gmt-time-to-local-time – aliboy38 2015-02-10 10:24:06

+7

不,一个地方不会改变时区(当然,这取决于您使用的时区数据)。时区更改UTC偏移量。例如,我在英国时区,即IANA/TZDB术语中的“欧洲/伦敦”。那是冬天的GMT和夏天的BST,但它仍然是一个时区。您的方法签名(除了参数大写)更令人担忧的是,一个国家只观察一个时区。以美国为例... – 2015-02-10 10:25:48

+0

Jon Skeet感谢您的宝贵意见。幸运的是,这个特定系统的目标国家没有多个时区,但是我会牢记这一点。 – 2015-02-10 10:28:52

回答

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
  • 夏威夷标准时间
  • 阿拉斯加标准时间
  • 太平洋标准时间(墨西哥)
  • Pacif IC标准时间
  • 美国山地标准时间
  • 山地标准时间(墨西哥)
  • 山地标准时间
  • 中美洲标准时间
  • 中部标准时间
  • 中部标准时间(墨西哥)
  • 加拿大中部标准时间
  • SA太平洋标准时间
  • Eastern S TANDARD时间
  • 美国东部标准时间
  • 委内瑞拉标准时间
  • 巴拉圭标准时间
  • 大西洋标准时间
  • 巴西中部标准时间
  • SA西部标准时间
  • 太平洋SA标准时间
  • 纽芬兰标准时间
  • E.南美标准T IME
  • 阿根廷标准时间
  • SA东部标准时间
  • 格陵兰标准时间
  • 蒙得维的亚标准时间
  • 巴伊亚标准时间
  • UTC-02
  • 大西洋中部标准时间
  • 亚速尔群岛标准时间
  • 佛得角标准时间
  • 摩洛哥标准时间
  • 协调世界时
  • GMT标准时间
  • 格林尼治标准时间
  • 西欧标准时间
  • 中欧标准时间
  • 浪漫标准时间
  • 中欧标准时间
  • W.中非标准时间
  • 纳米比亚标准时间
  • 约旦标准时间
  • GTB标准时间
  • 中东标准时间
  • 埃及标准时间
  • 叙利亚标准时间
  • E.欧洲标准时间
  • 南非标准时间
  • FLE标准时间
  • 土耳其标准时间
  • 耶路撒冷标准时间
  • 俄罗斯TZ 1标准时间
  • 利比亚标准时间
  • 阿拉伯语标准时间
  • 阿拉伯标准时间
  • 白俄罗斯标准时间
  • 俄罗斯TZ 2标准时间
  • E.非洲标准时间
  • 伊朗标准时间
  • 阿拉伯标准时间
  • 阿塞拜疆标准时间
  • 俄罗斯TZ 3标准时间
  • 毛里求斯标准时间
  • 格鲁吉亚标准时间
  • 高加索标准时间
  • 阿富汗标准时间
  • 西亚标准时间
  • 俄罗斯T Z 4标准时间
  • 巴基斯坦标准时间
  • 印度标准时间
  • 斯里兰卡标准时间
  • 尼泊尔标准时间
  • 中亚标准时间
  • 孟加拉国标准时间
  • 俄罗斯TZ 5标准时间
  • 缅甸标准时间
  • 东南亚标准时间
  • 俄罗斯TZ 6标准时间
  • 中国标准时间
  • 俄罗斯TZ 7标准时间
  • 马来半岛标准时间
  • W.澳大利亚标准时间
  • 台北标准时间
  • 乌兰巴托标准时间
  • 东京标准时间
  • 韩国标准时间
  • 俄罗斯TZ 8标准时间
  • 岑。澳大利亚标准时间
  • 澳大利亚中部标准时间
  • E.澳大利亚标准时间
  • 澳大利亚东部标准时间
  • 西太平洋标准时间
  • 塔斯马尼亚岛标准时间
  • 马加丹标准时间
  • 俄罗斯TZ 9标准时间
  • 俄罗斯TZ 10标准时间
  • 中部太平洋标准时间
  • 俄罗斯TZ 11标准时间
  • 新西兰标准时间
  • UTC + 12
  • 斐济标准时间
  • 堪察加标准时间
  • 汤加标准时间
  • 萨摩亚标准时间
  • Line Islands标准时间

不幸的是,我不能确定其正式命名标准/命名惯例用于上述列出的值

UPDATE

我有,因为我张贴了这个答案,通过使用乔恩斯基特的Nodatime库,这是一个用于处理日期时间概念的优秀库。我极力推荐它与BCL的日期,时间和时间跨度等级奋斗!

+1

该列表依赖于Windows操作系统。例如,旧版本可能没有萨摩亚标准时间。 – Carra 2015-02-10 12:26:46

+1

您应该使用'TimeZoneInfo.FindSystemTimeZoneById'而不是通过LINQ名称进行过滤。 ID是一致的,但是StandardName,DaylightName和DisplayName是由OS语言本地化的(http://codeofmatt.com/2014/12/26/localized-time-zone-names-in-net /)。 – 2015-02-11 20:14:23

+1

关于您对命名约定的评论 - 与Microsoft时区一样,没有统一的约定。如果您想要统一性,您需要使用[IANA/TZDB时区](http://en.wikipedia.org/wiki/Tz_database)。你可以用[Noda Time](http://nodatime.org/)做到这一点。此外,您应该阅读[时区标记wiki](http://stackoverflow.com/tags/timezone/info)。 – 2015-02-11 20:16:10