ConvertTimeToUtc总是关闭一个小时

时间:2016-04-27 07:24:37

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

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

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

TimeZoneInfo.ConvertTimeToUtc(mydate, selectedTimeZone);

示例#1:

  

如果mydate = 05/02/2016 09:00 AM,则选择TimesZon​​e = 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 .....但它对输出没有影响。

1 个答案:

答案 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,它不是“离开一个小时“。