【发布时间】: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 日进行测试真的让我很困惑!谢谢