【问题标题】:ConvertTimeToUtc is always off by one hourConvertTimeToUtc 总是关闭一小时
【发布时间】:2016-08-21 08:27:04
【问题描述】:

我在将日期时间转换为 UTC 时遇到问题。 用户在 webform 中的 mydate 中输入日期,我们需要将其转换为 UTC 并存储在 DB 中。

用户还从存储在 selectedTimeZone 变量中的列表中选择时区。所以我们必须将 mydate 从 selectedTimeZone 转换为 UTC。

TimeZoneInfo.ConvertTimeToUtc(mydate, selectedTimeZone);

示例#1:

如果 mydate = 05/02/2016 09:00 AM 并且 selectedTimeZone = EST (-5:00) 那么 TimeZoneInfo.ConvertTimeToUtc(mydate, selectedTimeZone) 返回 2016 年 5 月 2 日 13:00

一小时后关闭

示例#2

如果 mydate = 05/02/2016 09:00 AM 并且 selectedTimeZone = IST(印度 标准时间) (+5:30) 然后 TimeZoneInfo.ConvertTimeToUtc(mydate, selectedTimeZone) 返回 05/02/2016 03:30

这是正确的

这样的例子还有很多。

有什么问题?

编辑:

我不需要像 .net 那样将用户输入转换为 DateTime,我们在 mvc 操作方法参数中获取 mydate。

我通过将机器的本地时区设置为 UTC、伦敦、IST 来尝试它......但它对输出没有影响。

【问题讨论】:

  • 听起来像是夏令时问题。您是否将时区设置为使用夏令时?
  • @MatthewWatson,我从用户那里得到了我需要转换的时区字符串和日期时间.....如果我需要在这里做额外的调整,请告诉我
  • 你如何将用户的输入转换为日期时间?另外,您当地的时区是什么时候?
  • @Evk,我不需要像 .net 那样将用户输入转换为 DateTime,我们在 mvc 操作方法参数中获取 mydate。本地时区是 UTC
  • @Evk,我尝试在本地机器上设置 IST 但输出没有区别

标签: c# asp.net .net asp.net-mvc timezone


【解决方案1】:

似乎给定时区的调整规则在这里发挥了作用。取以下代码:

var mydate = new DateTime(2016, 05, 02, 9, 0, 0);            
var selectedTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var dstRule = selectedTimeZone.GetAdjustmentRules().FirstOrDefault(c => c.DateStart < mydate && c.DateEnd > mydate);

EST 时区只有一个调整规则,在给定时间有效(从 2007 年开始有效),该规则从每年 3 月的第二个星期日到 11 月的第一个星期日有效,调整时间一小时在那个时期。这就是你观察这种行为的原因。如果您尝试在此规则的期限之外转换日期(例如,2 月) - 您将得到您所期望的。

所以澄清一下:EST 时区的基本偏移量为 UTC-5,但由于夏令时在夏季变为 UTC-4,并且因为您的时间是“夏季” - .NET 实际上正确地将其转换为 UTC,它不是“关闭一小时”。

【讨论】:

  • 好答案。仅供参考 - 这也包含在 the timezone tag wiki: "Eastern Standard Time" refers to both EST and EDT.
  • @MattJohnson 谢谢,不知道有这样的 wiki 存在,而且里面有这么多信息。
猜你喜欢
  • 1970-01-01
  • 2016-07-03
  • 2023-03-24
  • 2022-01-14
  • 2018-04-17
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多