2014-02-26 88 views
5

我有一个以UTC(字符串类型)进来的UTC时间戳。我希望将此时间戳转换为东部时间。问题是当我在UTC时间戳上调用DateTime.Parse或Convert.ToDateTime时,它将它转换为我的本地时间,即中央时间。将UTC转换为东部时区

如何获取字符串时间戳并将其转换为东部时间,而不管其运行的服务器的本地时间?

+0

我不确定,但你可以尝试与文化。看看这个:http://msdn.microsoft.com/en-us/library/5hh873ya%28v=vs.90%29.aspx – George

+0

@George - 文化与时区无关。他们不会影响他们一点。 –

回答

7

我会尝试剖析你的问题,但下一次请出示一些代码,这样每个人都可以看到究竟是什么你的意思更清楚。

我有一个UTC时间戳来UTC(字符串类型)。

好吧,我假定你的意思是这样的:

string utcString = "2014-02-25T12:34:56.000Z"; 

这是一个ISO-8601 UTC时间戳。如果是其他格式,请在评论中告诉我,我会相应地更新答案。

...问题是,当我打电话DateTime.ParseConvert.ToDateTime在UTC时间戳,它是将其转换为我的本地时间,这是中部时间。

DateTime utcDateTime = DateTime.Parse(utcString, 
             CultureInfo.InvariantCulture, 
             DateTimeStyles.RoundtripKind); 

RoundtripKind风格告诉解析器查找输入字符串“厚道”的信息,如指示UTC的Z。结果DateTime将具有原始值,并且它的.Kind属性设置为DateTimeKind.Utc

...我想将此时间戳转换为东部时间。

既然您有UTC DateTime,那么您可以使用TimeZoneInfo类轻松转换它。

TimeZoneInfo easternTimeZone = TimeZoneInfo.FindSystemTimeZoneById(
                 "Eastern Standard Time"); 

DateTime easternDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, 
                  easternTimeZone); 

就是这样。结果是DateTime包含美国东部时区的当地时间。由于时区信息未与DateTime对象一起携带,因此实物为Unspecified

另请注意,“东部标准时间”是指整个美国东部时区,包括EST和EDT。

+0

你精美地解析了我写得不好的问题。谢谢你,先生。 – user1373121

+0

夏令时呢?对不起,如果业余问题 – donstack

+0

@donstack - 没问题。以上示例已经说明了夏令时。 “东部标准时间”的Windows时区ID名称很差,应该只是“东部时间”。它包含了EST和EDT。有关更多示例,请参见[时区标记wiki](http://stackoverflow.com/tags/timezone/info)。 –

2

Take a look here at the documentation.

基本上你需要使用TimeZoneInfo.FindSystemTimeZoneById("<Timezone>"); 然后使用该作为ConvertTime函数的第三个参数。参数2是您当前的时区。

DateTime hwTime = new DateTime(2007, 02, 01, 08, 00, 00); 
try 
{ 
    TimeZoneInfo hwZone = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 
    Console.WriteLine("{0} {1} is {2} local time.", 
      hwTime, 
      hwZone.IsDaylightSavingTime(hwTime) ? hwZone.DaylightName : hwZone.StandardName, 
     TimeZoneInfo.ConvertTime(hwTime, hwZone, TimeZoneInfo.Local)); 
} 
catch (TimeZoneNotFoundException) 
{ 
    Console.WriteLine("The registry does not define the Hawaiian Standard Time zone."); 
}       
catch (InvalidTimeZoneException) 
{ 
    Console.WriteLine("Registry data on the Hawaiian STandard Time zone has been corrupted."); 
} 
+1

只有链接的答案是不鼓励的... –

0

我发现了一个方便的解决方案:

var e_europe = TimeZoneInfo.FindSystemTimeZoneById("E. Europe Standard Time"); 
var utcnow = DateTime.UtcNow; 
Console.WriteLine(utcnow.ToString()); 
Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(utcnow, e_europe).ToString()); 

它打印

2/26/2014 1:03:43 AM 
2/26/2014 3:03:43 AM 
相关问题