我在将datetime转换为UTC时遇到问题。 用户在webform中的mydate中输入日期,我们需要将其转换为UTC并将其存储在DB中。
用户还从列表中选择存储在selectedTimeZone变量中的时区。所以我们必须将mydate从selectedTimeZone转换为UTC。
TimeZoneInfo.ConvertTimeToUtc(mydate, selectedTimeZone);
示例#1:
如果mydate = 05/02/2016 09:00 AM,则选择TimesZone = EST(-5:00) TimeZoneInfo.ConvertTimeToUtc(mydate,selectedTimeZone)返回 05/02/2016 13:00
关闭一小时
实施例#2
如果mydate = 05/02/2016 09:00 AM和selectedTimeZone = IST(印度人 标准时间)(+5:30)然后是TimeZoneInfo.ConvertTimeToUtc(mydate, selectedTimeZone)返回05/02/2016 03:30
这是正确的
有很多这样的例子。
问题是什么?
我不需要将用户输入转换为DateTime,因为.net这样做,我们在mvc动作方法参数中获取mydate。
我尝试将机器的本地时区设置为UTC,London,IST .....但它对输出没有影响。
答案 0 :(得分:7)
似乎给定时区的调整规则在这里发挥作用。请使用以下代码:
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月的第2个星期日到11月的第一个星期日,调整时间为1小时在那个时期。这就是你观察这种行为的原因。如果您尝试将此日期之外的日期转换为此规则(例如,在二月份) - 您将获得您期望的结果。
所以澄清一下:EST时区的基准偏移量为UTC-5,但由于夏令时夏令时变为UTC-4,而且因为你的时间是“夏天” - .NET实际上正确地将其转换为UTC,它不是“离开一个小时“。