我使用以下方法将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'即Atlantic夏令时(UTC-3:00) . 为什么在大西洋标准时间考虑DST?并非所有在大西洋时间的地方都考虑DST . 对于东部标准时间(UTC-5:00)和太平洋标准时间(UTC-8:00),转换在DST时是正确的 . 但是为什么在大西洋时间发生这种情况 . 大西洋日光时间也没有TimeZone ID . 我可以通过检查它是否是AST来增加一小时但是有没有更好的方法来处理AST和ADT?
1 回答
来自the timezone tag wiki:
这同样适用于大西洋时间 .
"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"
,这确实令人困惑,因为只有圣胡安实际上称之为区域"Atlantic" . 其他人有各种本地名称和缩写 .有关更多详细信息,请参阅this page . 如果您有特定的位置,请告诉我,我会相应更新 .
另外 - 你的代码有点混乱 . 它依赖于字符串格式化和解析方式太多,吞噬异常,并依赖于函数外部的外部变量 . 我建议你清理一下 .