ConvertTimeToUtc的例外情况

时间:2010-07-19 10:21:58

标签: c# .net datetime

您好,我将本地时间转换为UTC时有异常。我运行我的应用程序 在Windows上设置“俄罗斯标准时间”。

public Convert()
{
            DateTime dt = DateTime.Now;
            DateTime dt1 = DateTime.Now;

           // this converstion works
            TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local);

            // now let's get local timezone by id
            TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time");

            if (TimeZoneInfo.Local.Id == tz.Id)
            {
                // this is just to make sure we have the same timezones
            }

// this conversion does not work
// throws exception System.ArgumentException
TimeZoneInfo.ConvertTimeToUtc(dt1, tz);

}

更新

异常文字说 - 由于datetime的Kind属性,无法完成转换 是错的。例如,如果Kind是Local,则时区必须具有TimeZoneInfo.Local的值。

对不起,这不是一个copypaste - 原始消息不是英文。

2 个答案:

答案 0 :(得分:1)

msdn说:

  

的ArgumentException
  dateTime.Kind是DateTimeKind.Utc,sourceTimeZone不等于TimeZoneInfo.Utc。
   - 或 -
  dateTime.Kind是DateTimeKind.Local,sourceTimeZone不等于TimeZoneInfo.Local。

这似乎是个问题。 DateTime.Now返回 DateTimeKind.Local 但使用DateTime.SpecifyKind()对我有用:

dt1 = DateTime.SpecifyKind( dt, DateTimeKind.Unspecified );
TimeZoneInfo.ConvertTimeToUtc( dt1, tz );

答案 1 :(得分:1)

TimeZoneInfo.Equals方法不仅在Id上进行比较:它还测试两个时区具有相同的调整规则(TimeZoneInfo.HasSameRules) - 您可以使用Reflector看到这一点。

我怀疑本地时区实际上是使用夏令时,而TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time")正在返回没有夏令时的时区。

您应该可以使用调试器轻松检查。