【发布时间】:2017-04-11 17:18:13
【问题描述】:
我正在使用第 3 方 API,它将时间值作为 DateTime 值返回,并填写 1970 年 1 月 1 日作为日期部分。所以对于早上 5 点,它会返回类似1969-12-31T21:03:00.000-08:00
问题在于,如果用户在伦敦时间,C# 无法为 1970-01-01 应用 BST 调整。
例如,UTC 中的1970-01-01 5AM 应该是伦敦的1970-01-01 6AM。
See conversion
但是,C# 似乎没有应用这种转换:
var utcTime = new DateTime(1970, 1, 1, 5, 0, 0, DateTimeKind.Utc);
var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
var ukTime = TimeZoneInfo.ConvertTime(utcTime, britishZone);
Console.WriteLine(ukTime);
上面的代码仍然会打印 5AM。
但是,如果我将其设置为 BST 生效的较新日期,例如 2016 年 10 月 1 日,则相同的代码可以正确打印早上 6 点。
- 为什么会这样?
- 如何解决这个问题?我们的应用需要跨任何时区工作(即硬编码时区不是一个选项 - 我们基本上使用 Windows 本地时区)。
【问题讨论】:
-
如果您可以使用第三方库,您可以查看Noda Time,这可能会更好。
-
谢谢。 Noda Time 的 DateTimeZone.GetUtcOffset(..) 方法确实返回 1970-1-1 的 +1 偏移量,而 .NET 的 TimeZoneInfo.GetUtcOffset(..) 没有。但是,转换为 Noda Time 对我们来说是最后的手段。
标签: c# datetime timezone dst timezone-offset