我在将日期时间转换为 UTC 时遇到问题。用户在网络表单中以mydate输入日期,我们需要将其转换为UTC并将其存储在数据库中。
用户还从存储在选定时区变量中的列表中选择时区。因此,我们必须将mydate从选定的时区转换为UTC。
TimeZoneInfo.ConvertTimeToUtc(mydate, selectedTimeZone);
示例#1:
如果 mydate = 05/02/2016 09:00 AM 并且选择时区 = EST (-5:00),则 TimeZoneInfo.ConvertTimeToUtc(mydate, selectedTimeZone) 返回 2016-02-05 13:00
差了一个小时
示例#2
如果 mydate = 05/02/2016 09:00 AM 并且选择时区 = IST (印度) 标准时间) (+5:30) 然后 TimeZoneInfo.ConvertTimeToUtc(mydate, selected时区) 返回 05/02/2016 03:30
哪个是正确的
这样的例子有很多。
问题出在哪里?
编辑:
我不需要像 .net 那样将用户输入转换为 DateTime,我们在 mvc 操作方法参数中获取 mydate。
我通过将机器的本地时区设置为 UTC、伦敦、IST 来尝试......但它对输出没有影响。
似乎给定时区的调整规则在这里发挥了作用。采用以下代码:
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,它不是"偏差一小时"。