Наличие проблем с преобразованием моего DateTime к UTC

Я когда-то отметил хорошую статью приблизительно Усовершенствованный SQL Server, блокирующий по SQL-Server-Performance.com. Та статья идет вне классической ситуации с мертвой блокировкой, что Вы упомянули и могли бы дать Вам некоторое понимание Вашей проблемы.

56
задан marc_s 30 August 2009 в 20:47
поделиться

4 ответа

Структура DateTime поддерживает только два часовых пояса:

  • локальный часовой пояс, в котором работает машина.
  • и UTC.

Посмотрите на структуру 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
38
ответ дан 26 November 2019 в 17:08
поделиться

Как сказано в dtb, вы должны использовать DateTimeOffset , если вы хотите сохранить дату / время с определенным часовым поясом.

Однако из вашего сообщения совсем не ясно, что вам действительно нужно. Вы только приводите примеры с использованием DateTime.Now и говорите, что предполагаете , что используете серверное время. В какое время ты на самом деле хочешь? Если вам просто нужно текущее время в формате UTC, используйте DateTime.UtcNow или DateTimeOffset.UtcNow . Вам не нужно знать часовой пояс, чтобы узнать текущее время в формате UTC, именно потому, что он универсален.

Если вы получаете дату / время от пользователя каким-либо другим способом, пожалуйста, дайте больше информации - так мы сможем решить, что вам нужно сделать. В противном случае мы просто догадываемся.

7
ответ дан 26 November 2019 в 17:08
поделиться

UTC - это просто часовой пояс, который все согласовали в качестве стандартного часового пояса. В частности, это часовой пояс, в котором находится Лондон, Англия. РЕДАКТИРОВАТЬ : обратите внимание, что это не тот же часовой пояс; например, в UTC нет летнего времени. (Спасибо, Джон Скит)

Единственная особенность UTC заключается в том, что его намного проще использовать в .Net, чем в любом другом часовом поясе ( DateTime.UtcNow , DateTime.ToUniversalTime , и другие члены).

Поэтому, как уже упоминали другие, лучше всего для вас сохранить все даты в формате UTC в своей базе данных, а затем преобразовать их в местное время пользователя (написав TimeZoneInfo.ConvertTime ( time, usersTimeZone) перед отображением.


Если вы хотите быть более интересным, вы можете геолокации ваших пользователей

2
ответ дан 26 November 2019 в 17:08
поделиться

Вам необходимо установить От до Не указано , например:

DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
var utc = TimeZoneInfo.ConvertTimeToUtc(now , zone);

DateTimeKind. Местный означает местный часовой пояс, а не какой-либо другой часовой пояс. Вот почему вы получали сообщение об ошибке.

94
ответ дан 26 November 2019 в 17:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: