【问题标题】:c# TimeZoneInfo Errorc# TimeZoneInfo 错误
【发布时间】:2017-10-23 12:57:39
【问题描述】:

在使用 C# 内置函数从 ET 转换为 GMT 时,我遇到了一些异常情况。该程序正在解析一个包含美国东部时区日期戳的文件,用于预测电力负载。为了存储信息,东部时间转换为格林威治标准时间。代码sn-p是:

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: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

我是不是用错了函数?

【问题讨论】:

  • 我不是 C# 开发人员(我来这里是因为我关注 timezone 标签),但我猜你的问题可能类似于 this one
  • 如果您提供minimal reproducible example 来演示问题,那么帮助您会容易得多。我的猜测是,真的你想要 UTC,而不是英国时区——由“GMT 标准时间”混淆表示。

标签: c# timezone


【解决方案1】:

我的错。它按设计工作。结果是 ConvertTime 使用目标时区来应用更改规则,而不是源时区。

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

未指定 p.dtLocal 的 DateTimeKind。

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

【讨论】:

  • 这仍然会在 10 月 30 日为您提供 4 小时的偏移量,而您预计会有 5 小时的偏移量。您确定了这种差异的根源吗?
  • 当您阅读我 28 分钟前的评论时,这并不奇怪 - TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time")TimeZoneInfo.Utc 不同。
  • “原来 ConvertTime 使用目标时区来应用更改规则,而不是源时区。”不,它同时使用两者。它使用源区域计算出从哪个时刻开始,然后使用目标区域计算出目标区域中该时刻的本地时间。
猜你喜欢
  • 1970-01-01
  • 2011-06-26
  • 2017-08-31
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 2021-05-11
  • 2014-02-22
  • 2010-10-31
相关资源
最近更新 更多