El formato correcto ISO 8601
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í)
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()
?