Я когда-то отметил хорошую статью приблизительно Усовершенствованный SQL Server, блокирующий по SQL-Server-Performance.com. Та статья идет вне классической ситуации с мертвой блокировкой, что Вы упомянули и могли бы дать Вам некоторое понимание Вашей проблемы.
Структура DateTime
поддерживает только два часовых пояса:
Посмотрите на структуру DateTimeOffset .
var info = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTimeOffset localServerTime = DateTimeOffset.Now;
DateTimeOffset usersTime = TimeZoneInfo.ConvertTime(localServerTime, info);
DateTimeOffset utc = localServerTime.ToUniversalTime();
Console.WriteLine("Local Time: {0}", localServerTime);
Console.WriteLine("User's Time: {0}", usersTime);
Console.WriteLine("UTC: {0}", utc);
Вывод:
Local Time: 30.08.2009 20:48:17 +02:00
User's Time: 31.08.2009 03:48:17 +09:00
UTC: 30.08.2009 18:48:17 +00:00
Как сказано в dtb, вы должны использовать DateTimeOffset
, если вы хотите сохранить дату / время с определенным часовым поясом.
Однако из вашего сообщения совсем не ясно, что вам действительно нужно. Вы только приводите примеры с использованием DateTime.Now
и говорите, что предполагаете , что используете серверное время. В какое время ты на самом деле хочешь? Если вам просто нужно текущее время в формате UTC, используйте DateTime.UtcNow
или DateTimeOffset.UtcNow
. Вам не нужно знать часовой пояс, чтобы узнать текущее время в формате UTC, именно потому, что он универсален.
Если вы получаете дату / время от пользователя каким-либо другим способом, пожалуйста, дайте больше информации - так мы сможем решить, что вам нужно сделать. В противном случае мы просто догадываемся.
UTC - это просто часовой пояс, который все согласовали в качестве стандартного часового пояса. В частности, это часовой пояс, в котором находится Лондон, Англия. РЕДАКТИРОВАТЬ : обратите внимание, что это не тот же часовой пояс; например, в UTC нет летнего времени. (Спасибо, Джон Скит)
Единственная особенность UTC заключается в том, что его намного проще использовать в .Net, чем в любом другом часовом поясе ( DateTime.UtcNow
, DateTime.ToUniversalTime
, и другие члены).
Поэтому, как уже упоминали другие, лучше всего для вас сохранить все даты в формате UTC в своей базе данных, а затем преобразовать их в местное время пользователя (написав TimeZoneInfo.ConvertTime ( time, usersTimeZone)
перед отображением.
Если вы хотите быть более интересным, вы можете геолокации ваших пользователей
Вам необходимо установить От
до Не указано
, например:
DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
var utc = TimeZoneInfo.ConvertTimeToUtc(now , zone);
DateTimeKind. Местный
означает местный часовой пояс, а не какой-либо другой часовой пояс. Вот почему вы получали сообщение об ошибке.