2016-04-19 13 views
-1

Ich analysiere Daten von einer externen Quelle (die im iso8601 Format sein müssen) und in ein seltsames Szenario laufen.Ruby Parsing von iso8601 Daten scheint gebrochen

require 'date' 
Date.iso8601('2000-05-01') #<Date: 2000-05-01 ((2451666j,0s,0n),+0s,2299161j)> 
Date.iso8601('200-05-01') #<Date: 2100-05-01 ((2488190j,0s,0n),+0s,2299161j)> 
Date.iso8601('20-05-01') #<Date: 2020-05-01 ((2458971j,0s,0n),+0s,2299161j)> 

Ich würde erwarten, dass die letzten 2 Anrufe mit ungültigem Argumente Ausnahmen sprengen, weil die Daten nicht im ISO8601-Format sind. Ist das ein Fehler in Ruby?

ruby --version 
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14] 
+0

Warum sind sie ungültig? – sawa

+0

Vielleicht wusste Ruby nur, dass Leute versuchen würden, es zu kaputt zu machen, also baute es Funktionen, um zu verhindern, dass es kaputt ging? ;) – 13aal

+0

@sawa ISO-8601 erfordert vierstellige Jahre –

Antwort

2

Nach dem docs:

Erstellt ein neues Date-Objekt durch aus einem String-Parsing nach einigen typischen ISO 8601-Formate.

Date.iso8601('2001-02-03')  #=> #<Date: 2001-02-03 ...> 
Date.iso8601('20010203')   #=> #<Date: 2001-02-03 ...> 
Date.iso8601('2001-W05-6')  #=> #<Date: 2001-02-03 ...> 

nicht wirklich sicher, was „typisch ISO 8601-Formate“ bedeuten, da es wirklich nur eine sein soll. Ich würde nicht sagen, dass es ein Fehler ist.

Wenn Sie strenge Parsing wollen, dann würde ich Date#strptime betrachten.

+0

Ich bin nicht ganz einverstanden darin, dass es kein "Bug" ist. Wenn das Ruby-Team Sie beauftragte, Date.iso8601 zu implementieren, würden Sie 2 Unit-Tests schreiben, die überprüfen, dass "2001-02-03" der 3. Februar 2001 ist, aber "200-02-03" der 3. Februar 2100 ist? –