Pergunta

Estou apenas começando a pensar corretamente sobre o lançamento de um webapp que precisará fazer as coisas com os usuários no início do dia, digamos às 6h. Também no final de seus dias.

Em todos os lugares que tenho lido sobre pessoas dizendo muito apenas para usar. Estou no Reino Unido, então pensei que isso tinha a ver com alguma compensação do GMT para o UTC, embora isso não faça sentido para mim, pois a economia de luz do dia deve estar desligada no momento).

Eu tenho um campo no banco de dados que armazena o fuso horário dos usuários e, assim, quando comecei a usar o ConvertTimetOutc e a Fromutc, ele começou a fazer o que eu esperava fazer. Embora, novamente, não tenho certeza se tenho que construir alguma lógica para fazer conversões de economia de verão, ou isso deve fazer isso por mim.

Estou me perguntando principalmente por que todo mundo estava falando. fez sentido.

Alguém poderia explicar como cada métodos poderia ser útil?

Foi útil?

Solução

Se você executar o código em uma máquina em um fuso horário diferente, seus cálculos ainda funcionarão? Esta é a razão pela qual as pessoas armazenam e tratam todos os dados como UTC - ele remove qualquer ambiguidade. Você não precisaria armazenar o fuso horário do usuário. Qualquer máquina, em qualquer lugar, pode puxar uma data do banco de dados e convertê -la de e para os horários locais com facilidade.

Se você estiver armazenando momentos em outro fuso horário, precisará retirá -lo, calcule o deslocamento para o fuso horário desejado, incluindo fatoração nos horários de poupança do dia e considerações internacionais da linha de dados. No seu caso, você também está armazenando informações desnecessárias extras.

Outras dicas

Realmente é uma diferença entre esses dois.

No .NET 3.5 e inferior, Datetime.ToUniversalTime é implementado como:

public DateTime ToUniversalTime() {
    return TimeZone.CurrentTimeZone.ToUniversalTime(this);
}

Porque usou o TimeZone classe, sofreu os mesmos problemas mencionados em O MSDN Docs:

o TimeZone A classe suporta apenas uma única regra de ajuste do horário de verão para o fuso horário local. Como resultado, o TimeZone A classe pode relatar com precisão informações sobre o horário de verão ou converter entre o UTC e o horário local apenas para o período em que a regra de ajuste mais recente está em vigor. Por outro lado, o TimeZoneInfo A classe suporta várias regras de ajuste, o que possibilita trabalhar com dados históricos do fuso horário.

No .NET 4.0 e superior, Datetime.ToUniversalTime é implementado como:

public DateTime ToUniversalTime() { 
    return TimeZoneInfo.ConvertTimeToUtc(this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
} 

Isso resolve o problema sobre não apoiar regras de ajuste histórico, mas devido ao NoThrowOnInvalidTime bandeira, não é o mesmo como apenas ligar TimeZoneInfo.ConvertimeToUtc.

O método que chama é um interno sobrecarga de ConvertTimeToUtc Isso leva um TimeZoneInfoOptions bandeira. o público Versão do método usa TimeZoneInfoOptions.None, enquanto este usa TimeZoneInfoOptions.NoThrowOnInvalidTime.

A diferença pode ser ilustrada da seguinte maneira. Com o fuso horário definido para o tempo do Pacífico:

DateTime dt = new DateTime(2015, 3, 8, 2, 0, 0, DateTimeKind.Local);
DateTime utc = dt.ToUniversalTime();
Console.WriteLine(utc); // "3/8/2015 10:00:00 AM"

Vs:

DateTime dt = new DateTime(2015, 3, 8, 2, 0, 0, DateTimeKind.Local);
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt);  // throws exception!
Console.WriteLine(utc);

Desde essa data, neste fuso horário, o tempo pula de 1:59:59 às 15:00:00, fornecer um horário local de 2:00:00 não é válido. A coisa correta a fazer é lançar uma exceção (como no segundo caso). No entanto, desde o contrato existente de DateTime.ToUniversalTime Das versões da estrutura anterior não permitiram isso, a estrutura escolhe retornar um valor em vez de jogar.

O valor que escolhe é calculado com base no uso do horário padrão Offset, como se a transição do DST não tivesse ocorrido.

EDIT: Eu estava errado. Veja Matt Johnson's responda Para uma explicação das diferenças sutis entre as implementações de DateTime.ToUniversalTime e TimeZoneInfo.ConvertTimeToUtc.

Para qualquer outra pessoa que tenha a pergunta específica formulada no título: Qual é a diferença entre DateTime.TouniversalTime e TimeZoneInfo.converttimetoutc?

A resposta é: Não há diferença.

Usando JustDecompile para inspecionar a implementação de DateTime.ToUniversalTime No .NET 4.5, vemos que ele usa TimeZoneInfo.ConvertTimeToUtc diretamente:

    public DateTime ToUniversalTime()
    {
        return TimeZoneInfo.ConvertTimeToUtc(this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top