.net 将UTC时间转换为“UTC”时的时间错误;E.南美洲标准时间“;
我创建此方法是为了将日期时间从UTC转换为另一个时区.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
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代码)