【问题标题】:System.DateTime.Now.ToLocalTime not returning my local timeSystem.DateTime.Now.ToLocalTime 不返回我的当地时间
【发布时间】:2014-07-01 18:45:06
【问题描述】:

我收到了

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

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

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

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

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

【问题讨论】:

  • 旁注:Now 已经是Kind=Local,所以你的ToLocalTime 调用完全没有任何作用。
  • 您能否使用 DateTime.UtcNow 并跳过除演示之外的转换需求,即仅使用 UTC 日期时间在内部工作?
  • 我添加了 TimeZoneInfo.ClearCachedData();在我调用 Now 之前,它现在返回正确的时间。
  • 你应该把它写下来作为答案。
  • 问题在哪里?

标签: c# .net datetime timezone dst


【解决方案1】:

你写的绝对不可能。

你说你得到了错误:

"提供的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,其中包含相关详细信息。

【讨论】:

  • 不是 DateTime eventDate = System.DateTime.Now.ToLocalTime();那就是产生错误。我只是想创建一个类似于传递给创建 UTC 日期的方法的日期时间。这是创建抛出错误的 UTC 日期的方法。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    相关资源
    最近更新 更多