我得到一个
当我尝试将时间转换为"提供的DateTime表示一个无效的时间。例如,当时钟向前调整,跳过周期内的任何时间无效"
UTC
时,消息。遇到这个问题的客户是在法国,但这个问题似乎是在美国实行夏令时时开始的。我看到代码中有一个地方使用了东部时区。我想它一定是想用东部标准时间。
无论如何,我试着模仿他们的场景,在将我的区域设置为法语/法国和时区设置为阿姆斯特丹,柏林等后调用相同的方法。我的测试代码是:
DateTime eventDate = System.DateTime.Now.ToLocalTime();
不合理的是它返回的是美国东部夏令时的日期时间,而不是我的系统时钟显示的时间。BIOS时钟设置为EDT还是什么?我的意图是将eventDate传递给我的法国客户端似乎工作不正确的方法。
你所写的绝对是不可能的。
你说你得到错误:
"提供的DateTime表示一个无效的时间。例如,当时钟向前调整时,跳过的时间段内的任何时间都是无效的"
这只能发生在将本地时间转换为UTC - 时,而不能反过来。
也只能在TimeZoneInfo
上使用转换方法时发生。例如,下面的代码将使用该消息创建一个异常:
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime dt = new DateTime(2014, 3, 9, 2, 30, 0);
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt, tz);
你可能也认为如果你的计算机时区设置为"东部标准时间",你也会得到同样的异常,并运行以下代码:
DateTime dt = new DateTime(2014, 3, 9, 2, 30, 0);
DateTime utc = dt.ToUniversalTime();
但是,此方法将静默地允许无效输入,而不会抛出异常。它只会向前调整一个小时,就好像你过了3:30而不是2:30。
此外,正如其他人所指出的,DateTime.Now
已经是局部的,并且具有Local
类。所以调用ToLocalTime
不会做任何事情。如果你想调用ToUniversalTime
,那么就使用DateTime.UtcNow
。
您可能还对dst标记wiki和时区标记wiki感兴趣,它们包含相关的详细信息。
我添加了TimeZoneInfo.ClearCachedData();在我调用Now之前,它现在返回正确的时间。