Pregunta

Estoy refactorización algo de código para una biblioteca de Ruby. Este código incluye un analizador Fecha. Una de las pruebas consistía en analizar esta cadena "2008-02-20T8: 05: 00 a 010: 00", que se supone que es ISO 8601 .

El código anterior sería en realidad de salida: "Vie Dic 20 18:05:00 UTC 2008". Mi nuevo código muestra que: "Vie Dic 20 16:05:00 UTC 2008"

Mi pregunta es: ¿cuál es el más adecuado

?

Time.parse en Ruby da el segundo. Pero, de nuevo, quiero estar 100% seguro de que el código anterior y la prueba eran defectuosos.

Cuál es la correcta? (Por quizá analizar la cadena con una biblioteca en otro idioma? -. Sólo sé Rubí)

¿Fue útil?

Solución

La hora UTC correcta es 1805. El grupo de tiempo indica 0805 en la zona -10, así que para obtener UTC añadir la 10 a la hora dada. Así 1805. Desde 1805 es menor que 2400 es el mismo día.

Si el código está dando a 1605, entonces es casi seguro que han establecido la zona horaria de forma incorrecta a la zona -8, que pasa a ser hora estándar del Pacífico.


Aha, parece que su formato de entrada está en mal estado. Observe:

irb(main):003:0> Time.parse("2008-02-20T8:05:00-010:00") 
=> Wed Feb 20 08:05:00 -0700 2008

Da la casualidad que en la zona -7 así que ha satisfaciendo eso a mi local. Pero

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

Me estoy poniendo un resultado inesperado. Ahora observar:

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

Hay esperada resultado. ¿Ver la diferencia? Primer ejemplo vs segundos:

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")

Tomé el espurio adicional 0 (que I desde luego no se dio cuenta tampoco) y zas, funciona.

Otros consejos

Sé que esto es bastante viejo, pero me acaba de ejecutar a través de ella.

apuesto a que algo en alguna parte está interpretando 010 como un octal número con el valor 8. Tal vez sea un error en la implementación de Time.parse()?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top