在 MVC4 C# 应用程序DateTime.Now
中,我在应用程序中创建对象时使用。部署后,本地计算机和主机之间有 +8 小时的差异。然后我将其更改为DateTime.UtcNow
,现在差异是 -4 小时。
例如在我的电脑中日期是20 Mar 2013, 14:28:12
,但日期存储到数据库中20 Mar 2013, 10:28:12.
我应该怎么做所有国家的所有用户才能使用 1 个相同的日期?
编辑:我的时区是(UTC+04:00) Baku,服务器遵循PST
在 MVC4 C# 应用程序DateTime.Now
中,我在应用程序中创建对象时使用。部署后,本地计算机和主机之间有 +8 小时的差异。然后我将其更改为DateTime.UtcNow
,现在差异是 -4 小时。
例如在我的电脑中日期是20 Mar 2013, 14:28:12
,但日期存储到数据库中20 Mar 2013, 10:28:12.
我应该怎么做所有国家的所有用户才能使用 1 个相同的日期?
编辑:我的时区是(UTC+04:00) Baku,服务器遵循PST
例如,假设您的用户在纽约 (GMT - 5),而您的服务器在印度 (GMT + 5:30)。
当用户看到上午 10:00 (EST) 的“本地”时间时,您的服务器将看到晚上 7:30 (IST) 的“本地”时间。但是,通过在这两个地方使用 UTC....用户会看到下午 3 点的 UTC 时间,而服务器会看到下午 3 点的 UTC 时间。
在所有地方使用 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
如您所见,您需要知道用户的时区。有两种方法可以知道用户时间:
我会建议那里的第一个选项,因为第二个选项会使人们的事情变得更加困难。例如,如果他们位于英国并在一周内飞往各州。一切都会改变区域,他们可能没有意识到!
当我在做一个国际用户使用的项目时,我们总是使用DateTime.UtcNow
如果它是一个本地项目 - 即仅设计用于您的时区,那么DateTime.Now
就足够了。
您的本地时间是您的系统时间。检查操作系统中的时区。您所指的服务器时间取决于您的服务器配置文件中的时区。
确保您的操作系统时区和您的服务器时区相似。