Como converter uma data para UTC corretamente e depois convertê-la novamente?

Estou lutando com a conversão de DateTime para UTC, o conceito e tudo, algo que não estou entendendo corretamente.

Quando recebo uma sequência de data e hora, digamos "10/07/2013", simplesmente

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

Isso gravará como "10/07/20134:00:00"no banco de dados. O servidor está localizado na costa leste dos EUA (-5). Obviamente, durante julho de 2013, o horário de verão ainda está sendo observado, portanto o deslocamento durante esse tempo é de -4, como as 4 horas extras4:00:00"gravado como UTC.

Enquanto escrevo este post, é fevereiro de 2014 e o horário de verão não está em vigor, então o deslocamento no momento é -5. No meu aplicativo, esse é o deslocamento que escolho no meu aplicativo.

Se eu aplicar deslocamento -5 a "7 /10/ 20134:00:00", a data será will" 7 /09/ 201323:00:00"

Que está errado e desligado por um dia.

Questão 1

Como então converto corretamente o horário UTC de volta? Ou seja, quando um usuário carrega meu aplicativo agora em fevereiro de 2014 (com deslocamento de fuso horário -5 no momento), 10/07/2013 04:00:00 ainda deve ser 07/10/2013, NÃO 7/09/2013.

O que me confunde é que, já que .ToUniversalTime () leva em consideração o horário de verão do servidor, existe um "horário universal" definido que não é afetado pelos locais onde o servidor está ????

Questão 2

O que acontece quando tenho servidores na costa oeste e leste, escrevendo no banco de dados? Como um aplicativo pode saber se um horário UTC sendo registrado se baseia na costa leste ou oeste?

basicamente, como o código pode dizer: "7/10/2013 4:00:00" é um horário UTC criado na costa leste (que indica 7/10/2013 00:00:00 para a costa leste dos EUA) e não por um servidor na costa oeste (que indica que é 7/09/2013 20:00:00 "para a costa oeste dos EUA)?

Desculpe, se isso soa estúpido. Qualquer conselho é apreciado.

========== Edição final, Minha solução atual ===============

A resposta do MiMo faz sentido. Eu estava confuso com duas coisas.

o que significa o tempo UTC armazenado no banco de dados para o servidor?qual é a relação do tempo do servidor com o usuário do aplicativo?

Meu aplicativo pode ser usado por usuários de fuso horário diferente e alguns usuários estão no mesmo fuso horário do servidor, outros não. Algumas viagens e, mesmo que estivessem no mesmo fuso horário do servidor, elas poderiam pousar em um fuso horário diferente o tempo todo. Meu aplicativo permite que eles escolham em que fuso horário estão e que refletem o horário adequadamente.

Originalmente, eu simplesmente pego o horário UTC do banco de dados e subtraio o fuso horário do usuário. Como Mimo sugeriu, está errado. O motivo pode ser visto no meu post acima.

Minha solução original era obter o fuso horário do servidor agora e usá-lo para adicionar / subtrair do UTC, e isso também está errado. Em 10/07/2013, o deslocamento do servidor na época era -4. No momento, em fevereiro de 2014, o deslocamento do fuso horário do servidor é -5. A solução para isso, é claro, é usar .ToLocalTime ()

Antes de me aprofundar na sugestão de Mimo sobre como usar o TimeZone.ToLocalTime (), aqui está o que eu fiz para corrigir temporariamente o problema.

Retire a data UTC do banco de dados e converta para .ToLocalTime, que é o que o servidor mostra. portanto, para o servidor, 10/07/2013 04:00:00 se torna 07/10/2013 12:00:00.

Obtenha o deslocamento do fuso horário do servidor. Ele mostra -5 atualmente, já que está na costa leste dos EUA.

Obtenha o deslocamento do fuso horário do usuário. Para a costa oeste, o usuário escolhe -8 no momento. Para a costa leste, o usuário escolhe -5 no momento.

Obtenha a diferença entre o fuso horário do usuário e o fuso horário do servidor. A costa oeste é -3. Costa Leste é 0.

Subtraia as diferenças de 10/7/2013 00:00, para que a costa oeste tenha uma data de vencimento 09/09/2013 21:00:00 e a costa leste tenha uma data de vencimento 10/10/2013 12:00:00.

Tudo certo.

Muito obrigado pessoal. Agora é hora de cavar TimeZone.ToLocalTime () e ver se consigo reduzir as etapas de 2 a 5.

questionAnswers(5)

yourAnswerToTheQuestion