0

我创建了这个方法来将 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. South America Standard Time" (--03:00 GMT) 和 time= "16/05/2013 20:00:00" (UTC 时间)时,此方法无法正常工作。

正确的日期时间必须是“16/05/2013 17:00:00”,但我得到“16/05/2013 16:00:00”。为什么?

4

1 回答 1

1

你想多了。你只需要:

TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);
DateTime result = TimeZoneInfo.ConvertTimeFromUtc(time, tz);

你可以通过"E. South America Standard Time"没有timeZoneName问题。

你不需要先切换种类。要么UtcUnspecified传入的种类将工作。如果你传递一种Local类型,那么你做错了什么,你会得到一个例外。请参阅文档

您也不需要查找 UTC/GMT,或手动检查 DST。这都是在内部完成的。

于 2013-05-17T02:36:39.687 回答