2014-11-21 7 views
6

Rubin richtig das erste Datum parst aber der zweite ist falsch. Getestet mit Rubin 1.9.3 und 2.1.2.Rubin falsch analysiert 2-stellige Jahr

Jede Idee, wie es zu bekommen konsequent zu arbeiten? (Wir sind als 2-stellige Jahre in Geburtsdaten bekommen)

Date.strptime("10/11/89","%d/%m/%y") 
=> Fri, 10 Nov 1989 

Date.strptime("15/10/63","%d/%m/%y") 
=> Mon, 15 Oct 2063 

Antwort

3

Die strptime Methode Parsing den Text "63" auf das Jahr 2063, nicht 1963, wie Sie wollen. Diese
ist, weil das Verfahren das Jahrhundert entscheidet durch die POSIX standard verwenden.

Der chronic Edelstein hat ein ähnliches Problem, weil es das Jahrhundert entscheidet, wenn auch anders.

Eine Lösung ist das Datum einzustellen:

d = Date.strptime("15/10/63","%d/%m/%y") 
if d > Date.today 
    d = Date.new(d.year - 100, d.month, d.mday) 
end 

In den Kommentaren dieses Beitrags, Stefan schlägt ein gutes Motto:

d = d.prev_year(100) if d > Date.today 

Wenn Sie Geschwindigkeit benötigen, können Sie versuchen, zu optimieren wie dies:

d <= Date.today || d = d << 1200 
+0

oder 'd = d.prev_year (100), wenn d> Date.today' – Stefan

+0

Ihr zweiten Beispiel nicht zukünftige Termine im laufenden Jahr berücksichtigen. – Stefan

+0

@Stefan gute Punkte, danke. Ich werde das zweite Beispiel entfernen - es ist nicht so einfach und nicht so schnell. – joelparkerhenderson

-1

Chronic Juwel in Ihre Gemfile

gem 'chronic'

Dann analysieren es einfach:

Chronic.parse("15/10/68") 
=> 1968-10-15 12:00:00 -0700 
+1

Dies ist nur das Problem verschiebt sich: 'Chronic.parse ("15/10/63")' kehrt 2063 – Stefan

+1

@stefan dank für den Hinweis aus –

3

bei der Verwendung von %y in strptime, der Code geht davon aus, dass die Werte unter 68 im 21. Jahrhundert betrachtet werden, als descirbed here:

Das Jahr im Jahrhundert (0-99). Wenn ein Jahrhundert nicht anders angegeben ist (mit einem Wert für% C), beziehen sich Werte im Bereich von 69 bis 99 auf Jahre im zwanzigsten Jahrhundert (1969-1999); Werte im Bereich von 00-68 beziehen sich auf Jahre im einundzwanzigsten Jahrhundert (2000-2068).

Im chronic Juwel, nebenbei bemerkt, ist der Cut-off-Jahr 64:

Chronic.parse('15/10/64') 
# => 1964-10-15 12:00:00 +0200 

Chronic.parse('15/10/63') 
# => 2063-10-15 12:00:00 +0300 
+0

Interessant, dass Chronic eine andere Zuordnung verwendet. Ruby entspricht dem POSIX-Standard. – Stefan

+0

@Stefan - Sie änderten sie gerade genug, so dass sie bsy :-P –

+2

Chronic verwendet ein 50 Jahre standardmäßig versetzt und 2014 verwechseln können - 50 = 1964 – Stefan