【问题标题】:Why isn't my local DateTime being converted to UTC?为什么我的本地 DateTime 没有转换为 UTC?
【发布时间】:2020-08-26 09:48:21
【问题描述】:

我创建了一个本地日期时间,其中偏移量应为 00:01:00(格林威治标准时间)。但是,当转换为 UTC 时,它只是将种类指定为 UTC,并没有实际转换它。

    [Test]
    public void GivenLocalDateTime_WhenConverted_ThenBecomesUtc()
    {
        // Arrange
        var local = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Local);
        var expected = new DateTime(2019, 12, 31, 23, 0, 0, DateTimeKind.Utc);

        // Act
        var result = local.ToUniversalTime();

        // Assert
        Assert.AreEqual(DateTimeOffset.Now.Offset, TimeSpan.FromHours(1)); // Passes
        Assert.AreEqual(expected.Kind, result.Kind); // Passes
        Assert.AreEqual(expected, result); // Fails

        /*
            Expected: 2019-12-31 23:00:00
            But was:  2020-01-01 00:00:00
        */
    }

我尝试了几条路线。使用 TimeZoneInfo...

var result = TimeZoneInfo.ConvertTimeToUtc(local, TimeZoneInfo.Local);

并将其解析为字符串...

var result = DateTime.Parse(local.ToString("O"), CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal);

这些都不起作用。我觉得所有这些都应该有效。我错过了什么?

【问题讨论】:

  • 你在哪个时区?请注意,new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Local) 可能是标准时间,而DateTimeOffset.Now.Offset 可能是 DST。
  • 我在伦敦,查看 TimezoneInfo.Local 显示为 +00:00:00
  • 因为夏令时
  • “我创建了一个本地日期时间,其偏移量应为 00:01:00(GMT 标准时间)。” - 当您在伦敦并且您已指定一月份的日期时,为什么您希望偏移量为 1 小时?一月份的 UTC 偏移量为 0。
  • 啊,我明白了!我认为选择 1 月 1 日进行测试真的让我很困惑!谢谢

标签: c# .net .net-core utc


【解决方案1】:

这验证您当前(8 月)比 UTC 早 1 小时:

Assert.AreEqual(DateTimeOffset.Now.Offset, TimeSpan.FromHours(1)); // Passes

虽然实际测试转换了 1 月的日期,但可能存在不同的 UTC 偏移量。因此,如果您已配置 DST,则预计您的测试会失败。

【讨论】:

  • 您知道如何使用 DST 而不是标准时间将 DateTime 从本地转换为 UTC 吗?
  • 我不明白;您在测试中选择的数据 (01.01.2020) 在伦敦肯定没有 DST。
  • @numberjak:为什么要在不遵守夏令时的日期使用夏令时?任何时候你觉得你需要这样做,都可能在某个地方存在更大的问题。
  • @numberjak 我认为这里对 DST 的工作方式存在根本性的误解。您可能想退后一两步,做一些阅读。 (无意冒犯)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 2020-08-05
  • 1970-01-01
相关资源
最近更新 更多