【问题标题】:ConvertTimeFromUtc calculating 00:00:00 for (UTC-07:00) ArizonaConvertTimeFromUtc 为 (UTC-07:00) 亚利桑那州计算 00:00:00
【发布时间】:2018-09-09 15:40:21
【问题描述】:

我正在尝试计算从 UTC 到特定时区的时间。我为此使用 ConvertTimeFromUtc 方法,方法是将指定的 UTC 时间和指定时区显示名称的 TimeZoneInfo 传递给它。这适用于多个时区,但对于 -7,它使用以下(简化)参数计算 0:

TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("US Mountain Standard Time");
TimeZoneInfo.ConvertTimeFromUtc(DateTime.Parse("01/01/0001 05:02:00"), timeZoneInfo)

但是在进行计算后,它显示为 {01/01/0001 00:00:00},这很奇怪,因为它适用于明斯克等其他时区

我错过了什么吗?

【问题讨论】:

  • 抱歉,您的代码甚至无法编译,因为ConvertTimeFromUtcDateTime 作为第一个参数。您能否创建一个minimal reproducible example 来证明您的问题?
  • 已更新,以便编译。当我去掉我必须简化场景的内容时(因为它在其他时区工作)我忘记了它需要一个 DateTime 而不是一个字符串。

标签: c# datetime timezone


【解决方案1】:

嗯,你有 UTC-7,所以从 01/01/0001 05:02:00 开始,你在 31/12/0000 22:02:00 (或 12/31/0000 遵循美国格式)

 TimeZoneInfo.ConvertTimeFromUtc(DateTime.Parse("01/01/0001 05:02:00"), timeZoneInfo);

msdn 说:

DateTime 值类型表示日期和时间,其值范围从 0001 年 1 月 1 日 00:00:00(午夜)至 11:59:59 P.M.,公元 9999 年 12 月 31 日(C.E.)在公历中。

所以 01/01/0001 00:00:00 是第一个可用的日期..

你没有错过任何东西,它只是日期时间的限制

对不起我的英语

【讨论】:

  • 这是解决方案,谢谢!我没有使用默认的 DateTime(如您所说的 01/01/0001 00:00:00),而是使用 01/01/1900 作为日期初始化了对象,现在一切都正确计算了。因为我只返回时间而不是日期,所以日期本身并不重要。
  • @PaulCooney - 通常您应该提供具体日期,因为由于 DST 和多年来标准时间的变化,许多时区会为不同的日期提供不同的偏移量。如果您只有时间,请考虑用户可能期望它的行为方式。例如,如果“今天”是预期 - 不要使用 1900。
猜你喜欢
  • 2020-06-07
  • 2016-10-07
  • 2021-07-05
  • 2021-05-31
  • 2017-01-27
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多