在MVC4 C#应用程序中,我在我的应用程序中创建对象时使用了DateTime.Now.部署后,本地计算机与托管之间存在8小时的差异.然后我将其更改为DateTime.UtcNow,现在差异为-4小时.
例如,在我的计算机日期是2013年3月20日,14:28:12,但日期存储到数据库,如2013年3月20日,10:28:12.
我应该为所有国家的所有用户使用同一个日期做什么?
编辑:我的时区是(UTC 04:00)巴库,服务器正在跟随PST
解决方法
例如,假设您的用户位于纽约(GMT – 5),而您的服务器位于印度(GMT 5:30).
当用户看到上午10:00(美国东部时间)的“本地”时间时,您的服务器将看到下午7:30(IST)的“本地”时间.但是,通过在两个地方使用UTC ……用户将看到UTC时间为下午3点,服务器将看到UTC时间为下午3点.
在所有地方使用UTC但保留用户时区的参考允许您始终使用UTC,但是当您想要向他们展示时,仍然将时间转换为用户“本地”时间.
如果服务器是虚拟服务器,您也不能依赖服务器的托管位置.您也不能假设托管公司将服务器设置为什么时区.在数据库中存储日期时间时,最好始终使用DateTime.UtcNow进行防御性编码.
要将此UTC时间转换回用户的时区,您需要执行以下操作:
DateTime utcTime = new DateTime(2013,03,25,10,20,00); TimeZoneInfo usersTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTime usersLocalTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime,usersTimeZone); Console.WriteLine(utcTime.ToString("hh:mm:ss"); Console.WriteLine(usersLocalTime.ToString("hh:mm:ss");
仅供参考,您可以从以下位置找到时区列表:
TimeZoneInfo.GetSystemTimeZones()
这应打印出来:
10:20:00 05:20:00
如您所见,您需要知道用户的时区.有两种方法可以了解用户的时间:
>让用户在其用户首选项中选择他们的时区
>使用一些javascript来检测他们机器的时区并将其与表单一起发回
我会建议第一个选择,因为第二个选项可以让人们更加困难.例如,如果他们是英国人并且本周飞往各州.一切都会改变区域,他们可能没有意识到!