我使用以下方法将utc datetime转换为与其他时区对应的datetime
public string ConvertUTCDateTimetoUserDateTime(string utcDate)
{
DateTime userDateTime = new DateTime();
String displaydate = String.Empty;
try
{
destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById(TIMEZONE_ID);
DateTime returndt = Convert.ToDateTime(utcDate);
string strDate = String.Format("{0:" + DATE_FORMAT + " " + "HH:mm}", returndt);
sourceTimeZone = TimeZoneInfo.Utc;
string dateFormat = DATE_FORMAT + " " + "HH:mm";
DateTime unspecified = DateTime.ParseExact(strDate, dateFormat, CultureInfo.InvariantCulture);
userDateTime = TimeZoneInfo.ConvertTime(unspecified, sourceTimeZone, destinationTimeZone);
displaydate = userDateTime.ToString(DATE_FORMAT + " HH:mm");
}
catch (Exception ex)
{
}
return displaydate;
}
如果我将'03 / 19/2016 18:48'作为UTC日期和时区传递为“大西洋标准时间”(UTC-4:00),那么它将它转换为'03 / 19/2016 15:48'这是大西洋夏令时(UTC-3:00)。为什么在大西洋标准时间考虑DST?并非所有在大西洋时间的地方都考虑DST。对于东部标准时间(UTC-5:00)和太平洋标准时间(UTC-8:00),转换在DST时是正确的。但是为什么在大西洋时间发生这种情况。大西洋日光时间也没有TimeZone ID。我可以通过检查它是否是AST来增加一小时,但有没有更好的方法来处理AST和ADT?
答案 0 :(得分:0)
标识符和名称混乱并随意分配。多年来,命名约定各不相同,而且几乎没有一致性。通常,不要依赖Windows时区标识符来表示任何特定的内容。而是根据其显示名称选择时区。
一些例子:
"东部标准时间"是指EST和EDT。
...
这同样适用于大西洋时间。 "Atlantic Standard Time"
条目的显示名称为"(UTC-04:00) Atlantic Time (Canada)"
,适用于AST和ADT。它适用于加拿大的地方,如哈利法克斯,格莱斯湾,鹅湾和蒙克托。它也适用于拓乐空军基地(格陵兰岛)和百慕大。
大西洋时间不的地点有DST应该使用"SA Western Standard Time"
条目。它的显示名称为"(UTC-04:00) Georgetown, La Paz, Manaus, San Juan"
,这确实令人困惑,因为只有圣胡安实际上称这个区域为#34; Atlantic"。其他人有各种本地名称和缩写。
有关详细信息,请参阅this page。如果您有特定的位置,请告诉我,我会相应更新。
另外 - 你的代码有点混乱。它过于依赖字符串格式化和解析方式,吞噬异常,并依赖于函数外部的外部变量。我建议你清理一下。