将UTC转换为东部时区

时间:2014-02-26 00:08:26

标签: c# timezone

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

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

3 个答案:

答案 0 :(得分:9)

我会尝试剖析您的问题,但下次请展示一些代码,以便每个人都能更清楚地看到您的意思。

  

我的UTC时间戳是UTC(字符串类型)。

好的,我认为你的意思是这样的:

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

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

  

...问题是当我在UTC时间戳上调用DateTime.ParseConvert.ToDateTime时,它将其转换为我当地时间,即中心时间。

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

RoundtripKind样式告诉解析器在输入字符串中查找“kind”信息,例如指示UTC的Z。生成的DateTime将具有原始值,并且.Kind属性设置为DateTimeKind.Utc

  

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

现在您已拥有UTC DateTime,您可以使用TimeZoneInfo类轻松转换它。

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

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

就是这样。结果是DateTime包含美国东部时区的当地时间。它的类型为Unspecified,因为时区信息不会与DateTime对象一起传送。

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

答案 1 :(得分:2)

Take a look here at the documentation.

基本上你需要使用TimeZoneInfo.FindSystemTimeZoneById("<Timezone>"); 然后将其用作ConvertTime函数的第3个参数。参数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.");
}

答案 2 :(得分: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