【问题标题】:There is a difference between local and server time本地时间和服务器时间存在差异
【发布时间】:2013-03-09 09:52:37
【问题描述】:

在 MVC4 C# 应用程序中,当在我的应用程序中创建对象时,我使用了 DateTime.Now。部署后,本地计算机和主机之间有 +8 小时的差异。然后我改成DateTime.UtcNow,现在相差-4小时。

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

所有国家/地区的所有用户都应该怎么做才能使用 1 个相同的日期?

编辑:我的时区是 (UTC+04:00) 巴库,服务器遵循 PST

【问题讨论】:

  • 这是给@JonSkeet 的,他喜欢约会时间问题:)
  • 嗯。不是问它是否已插入的人,而是:服务器上的日期/时间是否正确?至少,它与您盒子上的相匹配吗?
  • ALSO:服务器在哪个时区,你在哪个时区?
  • Hosting 是 Arvixe,我不认为他们的时间不正确
  • 我在阿塞拜疆,时区是 (UTC+04:00) 巴库,服务器是 Arvixe。我现在不知道那个时区。我知道 DateTime.Now 总是需要服务器的日期/时间

标签: c# datetime timezone utc datetimeoffset


【解决方案1】:

假设您的用户在纽约 (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");

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

TimeZoneInfo.GetSystemTimeZones()

这应该打印出来:

10:20:00
05:20:00

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

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

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

【讨论】:

  • 我保存了 DateTime.UtcNow 之类的日期。现在,DateTime.UtcNow.ToLocalTime() 不能正常工作。
  • 您是否尝试在从数据库返回后将时间转换回来?如果是这样,则 DateTime 对象不知道用户的本地时间。它将使用服务器的本地时间。我将更新我的答案,以添加有关您需要做什么才能恢复原始时间的额外细节......
  • 谢谢,我明白了,我只能用 javascript 来做。在服务器端的 10 天里,我输入了一些代码,如 ToLocalTime() 等,以显示用户本地时间的日期/时间。所以,你说的不对。谢谢你。我可以通过全球化(文化和 uiCulture)来管理它吗?
【解决方案2】:

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

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

【讨论】:

  • 假设我的本地时间和服务器时间差不多,如果用户在其他国家?他们的时区不同
  • 您可以检测用户时区并在其本地时区显示时间。假设我在印度,我的当地时间是下午 5 点。服务器在加拿大渥太华,服务器时间是早上 7:30。服务器上存储的时间将是服务器时间。向用户显示时应转换为当地时间。
  • 好的,我明白了。我更改了所有 DateTime.UtcNow 并将在显示之前对其进行转换。谢谢
【解决方案3】:

当我在做一个国际用户使用的项目时,我们总是使用DateTime.UtcNow

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2014-04-11
    • 2010-10-11
    • 2014-04-18
    • 2014-08-07
    • 2016-05-12
    相关资源
    最近更新 更多