使用 C# 内置函数从 ET 转换为 GMT 时,我遇到了一些异常。 该程序正在解析包含预计电力负载的美国东部时区日期戳的文件。 为了存储信息,东部时间将转换为 GMT。 代码片段为:
DateTime _date;
TimeZoneInfo et = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
TimeZoneInfo gmt = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
。
DateTime.TryParse(table[_r, 0], out _date);
p.dtLocal = _date;
p.dtGMT = TimeZoneInfo.ConvertTime(p.dtLocal, et, gmt);
首先,该函数向东部增加 5 小时以获得格林威治标准时间。 今天的日期是 2017 年 10 月 22 日,所以它应该只增加了四个小时。 其次,在当地时间 10 月 29 日凌晨 1:00,它更改为增加 4 小时。 此更改应在 2017 年 11 月 5 日之后在美国进行,之后应增加 5 小时。
(转换前)
dtGMT {10/23/2017 12:00:00 AM} System.DateTime
dtLocal {10/23/2017 1:00:00 AM} System.DateTime
(转换后)
dtGMT {10/23/2017 6:00:00 AM} System.DateTime
dtLocal {10/23/2017 1:00:00 AM} System.DateTime
我是否错误地使用了这些功能?
我的错。 它正在按设计工作。 事实证明,转换时间使用目标时区来应用更改规则,而不是源区域。
正确的转换方法是ConvertTimeToUtc()。
未指定 p.dtLocal 的 DateTimeKind 。
//p.dtGMT = TimeZoneInfo.ConvertTime(p.dtLocal, et, gmt);
p.dtGMT = TimeZoneInfo.ConvertTimeToUtc(p.dtLocal, et);