c#TimeZoneInfo错误

时间:2017-10-23 12:57:40

标签: c# timezone

使用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个小时以获得GMT。今天的日期是2017年10月22日,所以它应该只增加四个小时。其次,10月29日当地凌晨1点,它改为增加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

我是否错误地使用了这些功能?

1 个答案:

答案 0 :(得分:0)

我的坏。它按设计工作。事实证明,ConvertTime使用目标时区来应用更改规则,而不是源区域。

转换的正确方法是ConvertTimeToUtc()。

p.dtLocal的DateTimeKind未指定。

//p.dtGMT = TimeZoneInfo.ConvertTime(p.dtLocal, et, gmt);
p.dtGMT = TimeZoneInfo.ConvertTimeToUtc(p.dtLocal, et);