我创建了这个方法,将DateTime从UTC转换为另一个时区
public static DateTime GetDateTimeFromUtcTo(string timeZoneName, DateTime time)
{
DateTime newDateTime = DateTime.SpecifyKind(time, DateTimeKind.Unspecified);
TimeZoneInfo newTzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);
bool isDaylight = newTzi.IsDaylightSavingTime(time);
TimeZoneInfo gmtTzi = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
if (!gmtTzi.Equals(newTzi))
{
newDateTime = TimeZoneInfo.ConvertTime(newDateTime, gmtTzi, newTzi);
}
if (isDaylight)
{
newDateTime = newDateTime.AddHours(1);
}
return newDateTime;
}
当timeZoneName
=“E。南美标准时间”( - 03:00 GMT)和time
=“16/05/2013 20:00:00时,此方法无法正常工作“(UTC时间)。
正确的日期时间必须是“16/05/2013 17:00:00”,但我得到“16/05/2013 16:00:00”。为什么呢?
答案 0 :(得分:0)
你过分思考它。你只需要:
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);
DateTime result = TimeZoneInfo.ConvertTimeFromUtc(time, tz);
您可以毫无问题地为"E. South America Standard Time"
传递timeZoneName
。
您不需要先切换那种。 Utc
或Unspecified
传入种类都可以使用。如果你传递Local
种类,那么你做错了什么就会得到一个例外。请参阅the documentation。
您也无需查找UTC / GMT,也无需手动检查DST。这一切都是在内部完成的。