我得到了
我尝试将时间转换为“提供的DateTime表示无效时间。例如,何时 在跳过的时间段内的任何时间向前调整时钟 无效“
UTC
时出现消息。遇到此问题的客户是在法国,但问题似乎是在美国进入夏令时时开始的。我看到代码中有一个使用东部时区的地方。我想它必须以某种方式尝试使用东部标准时间。
无论如何,在将我的语言环境设置为法语/法国语并将我的时区设置为阿姆斯特丹,柏林等之后,我尝试通过调用相同的方法来模仿他们的方案。我的测试代码正在执行:
DateTime eventDate = System.DateTime.Now.ToLocalTime();
没有意义的是它返回美国东部夏令时的日期时间,而不是我的系统时钟显示的时间。 BIOS时钟是否设置为EDT或其他什么?我的目的是将eventDate传递给我的法语客户端似乎工作不正常的方法。
答案 0 :(得分:2)
你所写的内容绝对不可能。
你说你收到了错误:
“提供的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
。
您可能还有兴趣阅读包含相关详细信息的the dst tag wiki和the timezone tag wiki。
答案 1 :(得分:1)
我添加了TimeZoneInfo.ClearCachedData();在我打电话给Now之前,它现在返回正确的时间。