Как правильно преобразовать дату в UTC, а затем преобразовать ее обратно?

Я борюсь с преобразованием DateTime в UTC, концепцией и всем, что я не правильно понимаю.

Когда я получаю строку даты и времени, скажем «7/10/2013», я просто

  Convert.ToDateTime("7/10/2013").ToUniversalTime();

Это будет записано как "10/10/20134:00:00 утра"в базе данных. Сервер расположен в восточном побережье США (-5). Конечно, в течение июля 2013 года DST все еще наблюдается, поэтому смещение за это время составляет -4, например, дополнительные 4 часа4:00:00 утра"записано как UTC.

Пока я пишу этот пост, сейчас февраль 2014 года, и летнее время не действует, поэтому смещение сейчас равно -5. В моем приложении это смещение, которое я выбираю в своем приложении.

Если я применю смещение -5 к "7 /10/20134:00:00 утра"дата будет" 7 /09/201311:00:00 PM».

Что не так и выходной на один день.

Вопрос 1

Как тогда мне правильно конвертировать время UTC назад? Это означает, что когда пользователь загружает мое приложение прямо сейчас, в феврале 2014 года (со смещением часового пояса -5 в настоящее время), 7 октября 2013 года в 4:00:00 утра должно быть все еще 7 октября 2013 года, а НЕ 7 сентября 2013 года.

Меня смущает то, что .ToUniversalTime () учитывает летнее время сервера, существует ли жесткий набор «универсального времени», на который не влияют местоположения сервера?

Вопрос 2

Что происходит, когда у меня есть серверы как на западном, так и на восточном побережье, для записи в базу данных? Как приложение может определить, основано ли время в формате UTC на восточном или западном побережье?

в основном, как тогда код может сказать, что "7/10/2013 4:00:00 AM" - это время UTC, созданное на восточном побережье (которое указывает на 7 октября 2013 00:00:00 AM для восточного побережья США) и не сервером на западном побережье (что указывает на то, что на 7 сентября 2013 г. 20:00:00 "для западного побережья США)?

Извините, если это звучит глупо. Любой совет приветствуется.

========== Окончательное редактирование, Мое текущее решение ===============

Ответ MiMo имеет смысл. Меня смутили две вещи.

что означает время UTC, хранящееся в базе данных, для сервера?Каково отношение времени сервера к пользователю приложения?

Мое приложение может использоваться пользователями из разных часовых поясов, и некоторые пользователи находятся в том же часовом поясе, что и сервер, а некоторые нет. Некоторые путешествия и так, даже если бы они находились в одном часовом поясе с сервером, они могли бы постоянно находиться в другом временном поясе. Мое приложение позволяет им выбирать, в каком часовом поясе они находятся, и они соответствующим образом отражают время.

Первоначально я просто извлекал время UTC из базы данных и вычитал из него смещение часового пояса пользователя. Как предположил Мимо, это неправильно. Причину можно увидеть в моем посте выше.

Моим первоначальным решением было получить смещение часового пояса сервера прямо сейчас и использовать его для добавления / вычитания из UTC, и это тоже неправильно. Как и 10 июля 2013 года, смещение сервера на тот момент было -4. Прямо сейчас, в феврале 2014 года, смещение часового пояса сервера равно -5. Решение этого, конечно, заключается в использовании .ToLocalTime ()

Прежде чем углубиться в предложение Мимо о том, как использовать TimeZone.ToLocalTime (), вот что я сделал, чтобы временно устранить проблему.

Получите дату UTC из базы данных и преобразуйте ее в .ToLocalTime, что показывает сервер. Таким образом, для сервера, 10 июля 2013 года 4:00:00 утра становится 7 октября 2013 года 12:00:00 утра.

Получить смещение часового пояса сервера. Он показывает -5 в настоящее время, так как он находится на восточном побережье США.

Получить смещение часового пояса пользователя. Для западного побережья пользователь выбирает -8 прямо сейчас. Для восточного побережья, пользователь выбирает -5 прямо сейчас.

Получите разницу между часовым поясом пользователя и часовым поясом сервера. Западное побережье -3. Восточное побережье 0.

Вычтите различия из 10.07.2013 в 12:00:00, чтобы у западного побережья была дата исполнения 7/09/2013 21:00:00 PM, а у восточного побережья была дата исполнения 7/10/2013 12:00:00 AM.

Все верно.

Большое спасибо, ребята. Теперь пора копаться в TimeZone.ToLocalTime () и посмотреть, смогу ли я уменьшить шаг 2-5.

Ответы на вопрос(5)

Ваш ответ на вопрос