O formato certo ISO 8601
Pergunta
Estou refatoração algum código para uma biblioteca Ruby. Este código inclui um analisador Data. Um dos testes foi o de analisar essa string "2008-02-20T8: 05: 00-010: 00", que é suposto ser ISO 8601 .
O código anterior seria realmente de saída: "Wed 20 de fevereiro 18:05:00 UTC 2008". Meus novos saídas de código que: "Wed 20 de fevereiro 16:05:00 UTC 2008"
.A minha pergunta é: qual é o caminho certo
Time.parse
em Ruby dá o segundo. Mas, novamente, eu quero ser 100% de certeza que o código anterior e teste foram buggy.
Qual é a certa? (Por talvez analisar a corda com uma biblioteca em outro idioma -?. Eu só sei rubi)
Solução
A hora UTC correto é 1805. O grupo de tempo indica 0805 na zona de -10, de modo a obter UTC adicionar o 10 ao momento. Assim 1805. Desde 1805 é inferior a 2400 é o mesmo dia.
Se o seu código está dando 1605, então você quase certamente tem o fuso horário definido incorretamente para zona -8, que passa a ser Horário padrão do Pacífico.
Aha, parece que o seu formato de entrada é confuso. Observe:
irb(main):003:0> Time.parse("2008-02-20T8:05:00-010:00")
=> Wed Feb 20 08:05:00 -0700 2008
Acontece que eu estar na zona de -7 por isso é adequando que à minha localidade. Mas
irb(main):004:0> t=Time.parse("2008-02-20T8:05:00-010:00")
=> Wed Feb 20 08:05:00 -0700 2008
irb(main):005:0> t
=> Wed Feb 20 08:05:00 -0700 2008
irb(main):006:0> t.getutc
=> Wed Feb 20 15:05:00 UTC 2008
Estou recebendo um resultado inesperado. Agora observe:
irb(main):007:0> t=Time.parse("2008-02-20T8:05:00-10:00")
=> Wed Feb 20 11:05:00 -0700 2008
irb(main):008:0> t.getutc
=> Wed Feb 20 18:05:00 UTC 2008
Há o resultado esperado . Veja a diferença? Primeiro exemplo vs segunda:
irb(main):004:0> t=Time.parse("2008-02-20T8:05:00-010:00")
irb(main):007:0> t=Time.parse("2008-02-20T8:05:00-10:00")
Eu levei o espúria adicional 0 fora (que I certamente não notar qualquer um) e whoosh, ele funciona.
Outras dicas
Eu sei que isso é muito velho, mas eu apenas correu em toda ela.
Eu aposto que 010
algo em algum lugar está interpretando como um octal número com o valor 8. Talvez seja um bug na implementação de Time.parse()
?