Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将UTC时间转换为“UTC”时的时间错误;E.南美洲标准时间“;_.net_C# 4.0_Timezone - Fatal编程技术网

.net 将UTC时间转换为“UTC”时的时间错误;E.南美洲标准时间“;

.net 将UTC时间转换为“UTC”时的时间错误;E.南美洲标准时间“;,.net,c#-4.0,timezone,.net,C# 4.0,Timezone,我创建此方法是为了将日期时间从UTC转换为另一个时区 public static DateTime GetDateTimeFromUtcTo(string timeZoneName, DateTime time) { DateTime newDateTime = DateTime.SpecifyKind(time, DateTimeKind.Unspecified); TimeZoneInfo newTzi = TimeZoneInfo.FindSystemTimeZoneBy

我创建此方法是为了将日期时间从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
=“东南美洲标准时间”(-03:00 GMT)和
Time
=“16/05/2013 20:00:00”(UTC时间)时,此方法无法正常工作


正确的日期时间必须是“16/05/2013 17:00:00”,但我得到的是“16/05/2013 16:00:00”。为什么?你想得太多了。你只需要:

TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);
DateTime result = TimeZoneInfo.ConvertTimeFromUtc(time, tz);
您可以通过
时区名称的
“E.南美标准时间”
,而不会出现问题

你不需要先换那种。
Utc
Unspecified
传入种类都可以工作。如果您正在传递一个
Local
类,那么您做错了什么,您将得到一个异常。看


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

这看起来更像是一个关于“夏令时”的问题,在该时区中不经常使用夏令时。。。这是一件非常复杂的事情。。。巴西想到了使用DateTimeKind。未指定是个坏主意。明确这是一个UTC时间戳,并使用TimeZoneInfo.ConvertTimeFromUtc()。在我的机器上生成17:00。当使用Linux时,这可能不起作用,请确保查看和(感谢Matt提供的OSS代码)