Pergunta

Eu tenho alguns serviços da Web C# que retornam JSON. O .NET JavaScriptSerializer retorna datas no tempo de Epoch (milissegundos desde 1970). Em qualquer máquina Windows, o aplicativo baseado na Web processa os milissegundos de volta à data adequada sem um problema.

No meu Mac, as datas às vezes estão desligadas em 1 hora. Nem toda vez. Só as vezes. Agora isso está acontecendo no front -end do iPhone que estou construindo também.

Pensei a princípio que havia perdido alguma precisão ao dividir os milissegundos por 1000 para criar um objeto NSDATE Objetivo-C válido. Em seguida, testei a criação da data em JavaScript no Mac Firefox com o mesmo registro de data e hora e obtive o mesmo deslocamento de 1 hora.

Alguma ideia? Obrigado...

EDIT: Eu também notei no console no Xcode que a data criada tinha um -4 ou -5 ao lado. Suponho que seja um deslocamento de GMT. Aqueles parecem variar independentemente se a data é ou não compensada por 1 hora. Portanto, algumas datas -4 e algumas datas estão corretas e algumas de ambas são compensadas.

Editar: Exemplos usando:

console.log(new Date(-1173643200000));

Retorna Sun 23 de outubro de 1932 00:00:00 GMT-0400 (EST)

console.log(new Date(-1031515200000));

Retornos Sáb 24 de abril de 1937 23:00:00 GMT-0500 (EST)

NSDate* date = [NSDate dateWithTimeIntervalSince1970:ticks / 1000];

-589320000000 =
1951-04-30 00:00:00 -0400

-1173643200000 =
1932-10-22 23:00:00 -0500 

(Este retorna correto no console do Firebug, errado no Xcode Console)

-1303416000000 =
1928-09-12 00:00:00 -0400

-1492545600000 =
1922-09-15 00:00:00 -0400

-1263668400000 =
1929-12-16 00:00:00 -0500

-1252094400000 =
1930-04-29 00:00:00 -0400

-1046458800000 =
1936-11-03 00:00:00 -0500

-1298746800000 =
1928-11-05 00:00:00 -0500

-1031515200000 =
1937-04-24 23:00:00 -0500   

(Retorna errado no console do Firebug e no Xcode Console)

-910465200000 =
1941-02-24 00:00:00 -0500

-1152648000000 =
1933-06-23 00:00:00 -0400

-1109793600000 =
1934-10-31 23:00:00 -0500

É possível que a Microsoft/Mozilla/Apple tenha regras conflitantes definindo quando o horário de verão começou naquela época?

Editar: Mac Firefox e Windows Firefox obtêm resultados diferentes para -1031515200000. Ambas as máquinas são definidas para o mesmo fuso horário.

Foi útil?

Solução

Meu palpite seria as diferenças de plataforma em relação a quando o DST terminar e começar. Os registros de data e hora para os anos atuais estão saindo certo?

Outras dicas

Parece que um deles está dando a você ticks desde a época, e o outro está dando a você milissegundos desde 1970 em 1º de janeiro no seu fuso horário local... ou eles estão interpretando os dados dessa maneira. Todas as datas "erradas" no verão, por acaso? (Editar: Agora eu vi sua edição, vejo que você está pensando nas mesmas linhas.)

Você poderia nos dar alguns valores de amostra e o código que está usando em vários lugares? Tem certeza de que o valor em si está errado e não é apenas um problema de exibição?

Se possível, seria uma boa ideia fornecer instantes desde a meia -noite de 1º de janeiro de 1970 UTC. A maioria das plataformas oferece uma maneira razoavelmente simples de lidar com isso. Em .net, se você usar DateTimeOffset ao invés de DateTime Você deve evitar pelo menos alguns desses problemas. (No futuro, é claro, a solução certa será usar Tempo noda. Mas ainda não.)

EDIT: Ok, agora você forneceu dados de amostra, não parece que existe realmente alguma inconsistência no instante Voltou ... é a conversão para a hora local que é diferente. É muito possível que plataformas diferentes tenham vistas diferentes das informações históricas do fuso horário, certamente - algumas podem ter apenas uma regra permanente que eles assumem que terão estar certo e vai Esteja certo para sempre, outros saberão sobre as várias mudanças envolvidas. Eu poderia Espero A maioria das plataformas para levar em consideração as mudanças históricas, reconhecidamente ...

No iPhone, pelo menos, eu esperaria que você pudesse escrever código para descobrir as transições do fuso horário e comparar isso com o que .Net dá via via TimeZoneInfo.

O que seu aplicativo está realmente fazendo com essas informações? Você está interessado nisso como um instante no tempo (que pode ser considerado em diferentes fusos horários) ou apenas na hora local?

Aposto que é uma coisa do fuso horário, onde seu Mac converte carimbo de data e hora no fuso horário local, o que para algum registro de data e hora está no horário de verão (DST), e alguns não estão, causando uma diferença de tempo em comparação com o UTC, que não tem DST .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top