本地和服务器时间之间存在差异

时间:2013-03-20 10:41:42

标签: c# datetime timezone utc datetimeoffset

在MVC4 C#应用程序中,当我的应用程序中创建了对象时,我使用了DateTime.Now。部署后,本地计算机与托管之间存在+8小时的差异。然后我将其更改为DateTime.UtcNow,现在差异为-4小时。

例如,我的计算机日期为20 Mar 2013, 14:28:12,但日期存储到数据库,如20 Mar 2013, 10:28:12.

我应该为所有国家的所有用户使用同一个日期做什么?

编辑:我的时区是(UTC + 04:00)Baku ,服务器正在关注 PST

3 个答案:

答案 0 :(得分:3)

例如,假设您的用户位于纽约(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

如您所见,您需要知道用户的时区。有两种方法可以了解用户的时间:

  1. 让用户在其用户首选项中选择他们的时区
  2. 使用一些javascript来检测其计算机的时区,并使用表单
  3. 将其发回

    我会建议第一个选项,因为第二个选项可能会让人们更加困难。例如,如果他们是英国人并且本周飞往各州。一切都会改变区域,他们可能没有意识到!

答案 1 :(得分:2)

当我处理国际用户使用的项目时,我们总是使用DateTime.UtcNow

如果它是本地项目 - 即仅为您的时区设计,那么DateTime.Now就足够了。

答案 2 :(得分:1)

您当地的时间是您的系统时间。检查操作系统中的时区。 您引用的服务器时间取决于服务器配置文件中的时区。

确保您的操作系统时区与服务器时区相似。