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)

Foi útil?

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()?

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