Il formato ISO 8601 corretto
Domanda
Sto refactoring del codice per una libreria Ruby.Questo codice include un parser di data.Uno dei test è stato analizzare questa stringa "2008-02-20T8:05:00-010:00" che dovrebbe essere ISO8601.
Il codice precedente in realtà restituirebbe:"Mercoledì 20 febbraio 18:05:00 UTC 2008" .Il mio nuovo codice restituisce che:"Mercoledì 20 febbraio 16:05:00 UTC 2008" .
La mia domanda è:qual è quello giusto?
Time.parse
in Ruby dà il secondo.Ma ancora una volta, voglio essere sicuro al 100% che il codice E il test precedenti fossero difettosi.
Qual è quello giusto?(Magari analizzando la stringa con una libreria in un'altra lingua?- Conosco solo Ruby.)
Soluzione
L'ora UTC corretta è 1805.Il gruppo orario indica 0805 nella zona -10, quindi per ottenere UTC aggiungere 10 all'ora specificata.Così 1805.Poiché il 1805 è inferiore al 2400 è lo stesso giorno.
Se il tuo codice indica 1605, quasi sicuramente hai il fuso orario impostato in modo errato su zona -8, che sembra essere l'ora standard del Pacifico.
Aha, sembra che il tuo formato di input sia incasinato.Osservare:
irb(main):003:0> Time.parse("2008-02-20T8:05:00-010:00")
=> Wed Feb 20 08:05:00 -0700 2008
Mi trovo nella zona -7 quindi è adatto al mio locale.Ma
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
Sto ottenendo un risultato inaspettato.Ora osserva:
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
C'è il previsto risultato.Vedi la differenza?Primo esempio vs secondo:
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")
Ho tolto lo 0 extra spurio (che IO di certo non me ne sono accorto neanche io) e whoosh, funziona.
Altri suggerimenti
So che è piuttosto vecchio, ma ci sono appena passato davanti.
Scommetto che qualcosa da qualche parte sta interpretando 010
come un ottale numero con il valore 8.Forse è un bug nell'implementazione di Time.parse()
?