2016-04-19 2 views
-1

Je suis l'analyse des dates d'une source externe (qui doivent être au format iso8601) et en cours d'exécution dans un scénario étrange.L'analyse de Ruby des dates de iso8601 semble cassée

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

j'attendre les 2 derniers appels à faire sauter des exceptions Invalid argument, parce que les dates ne sont pas au format ISO8601. Est-ce un bug de Ruby?

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

Pourquoi sont-ils invalides? – sawa

+0

Peut-être que Ruby savait juste où les gens allaient essayer de le casser, alors il a construit des fonctions pour l'empêcher d'être cassé? ;) – 13aal

+0

@sawa ISO-8601 requiert des années à quatre chiffres –

Répondre

2

Selon le docs:

Crée un nouvel objet Date par l'analyse syntaxique d'une chaîne selon certains ISO 8601 typique des formats.

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 ...> 

Pas vraiment sûr de ce que "les formats de type ISO 8601" signifient, car il devrait y avoir qu'un seul. Je ne dirais pas que c'est un bug.

Si vous voulez une analyse stricte, alors je regarderais Date#strptime.

+0

Je ne suis pas tout à fait d'accord pour dire que ce n'est pas un bug. Si l'équipe Ruby vous a demandé d'implémenter Date.iso8601, écririez-vous 2 tests unitaires qui vérifient que '2001-02-03' est le 3 février 2001, mais '200-02-03' est le 3 février 2100 ?? –