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

Jey*_*mov 7 c# timezone datetime 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)巴库,服务器正在关注PST

Ric*_*per 4

举例来说,您的用户位于纽约 (GMT - 5),您的服务器位于印度 (GMT + 5:30)。

当用户看到“本地”时间上午 10:00(美国东部时间)时,您的服务器将看到“本地”时间晚上 7:30(美国标准时间)。但是,通过在这两个地方使用 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");
Run Code Online (Sandbox Code Playgroud)

仅供参考,您可以从以下位置找到时区列表:

TimeZoneInfo.GetSystemTimeZones()
Run Code Online (Sandbox Code Playgroud)

这应该打印出:

10:20:00
05:20:00
Run Code Online (Sandbox Code Playgroud)

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

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

我建议第一个选择,因为第二个选择会让人们的事情变得更加困难。例如,如果他们位于英国并飞往美国一周。一切都会改变区域,但他们可能没有意识到!