System.DateTime.Now.ToLocalTime不返回我当地时间

时间:2014-05-13 22:01:19

标签: c# .net datetime timezone dst

我得到了

  

“提供的DateTime表示无效时间。例如,何时   在跳过的时间段内的任何时间向前调整时钟   无效“

我尝试将时间转换为UTC时出现

消息。遇到此问题的客户是在法国,但问题似乎是在美国进入夏令时时开始的。我看到代码中有一个使用东部时区的地方。我想它必须以某种方式尝试使用东部标准时间。

无论如何,在将我的语言环境设置为法语/法国语并将我的时区设置为阿姆斯特丹,柏林等之后,我尝试通过调用相同的方法来模仿他们的方案。我的测试代码正在执行:

DateTime eventDate = System.DateTime.Now.ToLocalTime();

没有意义的是它返回美国东部夏令时的日期时间,而不是我的系统时钟显示的时间。 BIOS时钟是否设置为EDT或其他什么?我的目的是将eventDate传递给我的法语客户端似乎工作不正常的方法。

2 个答案:

答案 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 wikithe timezone tag wiki

答案 1 :(得分:1)

我添加了TimeZoneInfo.ClearCachedData();在我打电话给Now之前,它现在返回正确的时间。