我有一个UTC时间戳(字符串类型)。我希望将此时间戳转换为东部时间。问题是,当我在UTC时间戳上调用DateTime.Parse或Convert.ToDateTime时,它正在将其转换为我的本地时间,即中心时间。
如何获取字符串时间戳并将其转换为东部时间,而不考虑其运行的服务器的本地时间?
我会仔细分析你的问题,但下次请展示一些代码,让每个人都能更清楚地理解你的意思。
我有一个UTC时间戳(字符串类型)。
好吧,我想你的意思是这样的:
string utcString = "2014-02-25T12:34:56.000Z";
这是一个ISO-8601 UTC时间戳。如果是其他格式的,请在评论中告诉我,我会相应地更新答案。
。。。问题是,当我在UTC时间戳上调用
DateTime.Parse
或Convert.ToDateTime
时,它会将其转换为我的本地时间,即中央时间。
DateTime utcDateTime = DateTime.Parse(utcString,
CultureInfo.InvariantCulture,
DateTimeStyles.RoundtripKind);
RoundtripKind
样式告诉解析器在输入字符串中查找"种类"信息,例如表示UTC的Z
。生成的DateTime
将具有原始值,并且它的.Kind
属性设置为DateTimeKind.Utc
。
。。。我希望将此时间戳转换为东部时间。
现在您有了UTCDateTime
,您可以使用TimeZoneInfo
类轻松地转换它。
TimeZoneInfo easternTimeZone = TimeZoneInfo.FindSystemTimeZoneById(
"Eastern Standard Time");
DateTime easternDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime,
easternTimeZone);
就是这样。结果是一个包含美国东部时区本地时间的DateTime
。它的种类将是Unspecified
,因为时区信息不与DateTime
对象一起携带。
另请注意,"东部标准时间"是指整个美国东部时区,包括东部时间和东部时间。
看看这里的文档。
基本上你需要使用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.");
}
我找到了一个方便的解决方案:
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