Существует разница между локальным и серверным временем

в приложении MVC4 c# я использовал DateTime.Now когда объект создан в моем приложении. После развертывания разница между локальным компьютером и хостингом составила +8 часов. Затем я изменил его на DateTime.UtcNow, теперь разница -4 часа.

например, в моем компьютере дата 20 Mar 2013, 14:28:12, но дата хранит в базе данных, как 20 Mar 2013, 10:28:12.

что я должен делать всем пользователям во всех странах, чтобы использовать 1 ту же дату?

Edit: мой часовой пояс в(UTC+04:00) Баку сервер после PST

3 ответов


допустим, например, что ваш пользователь находится в Нью-Йорке (GMT - 5), а ваш сервер-в Индии (GMT + 5:30).

когда пользователь видит "локальное" время 10: 00am (EST), ваш сервер будет видеть "локальное" время 7:30pm (IST). Однако, используя UTC в обоих местах....пользователь увидит время UTC 3pm, а сервер увидит время UTC 3pm.

использование UTC во всех местах, но сохранение referece часового пояса пользователей позволяет всегда работать в UTC, но по-прежнему преобразуйте время в "локальное" время пользователей, когда вы хотите показать его им.

вы также не можете полагаться на то, где сервер размещается особенно, если это виртуальный сервер. Также вы не можете предположить, в какой часовой пояс хостинговая компания установила свои серверы. Лучше всего всегда кодировать defensivly с помощью 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

как вы можете видеть, Вам нужно будет знать часовой пояс пользователей. Есть 2 способа узнать время пользователей:

  1. пользователь выбирает свой часовой пояс в своих пользовательских настройках
  2. используйте javascript для обнаружения часового пояса своей машины и отправьте его обратно с помощью формы

Я бы предложил первый вариант, так как второй можно усложнить людям жизнь. Например, если они базируются в Великобритании и летают в Штаты на неделю. Все изменится, и они могут не понять!


когда я работал над проектом, используемым международными пользователями, мы всегда использовали DateTime.UtcNow

если это локальный проект - т. е. предназначена только для использования в вашем часовом поясе, то DateTime.Now будет достаточно.


ваше местное время-это ваше системное время. Проверьте часовой пояс в операционной системе. Время сервера, на которое вы ссылаетесь, соответствует часовому поясу в файлах конфигурации сервера.

убедитесь, что у вас есть часовой пояс операционной системы и часовой пояс вашего сервера.