Feb 20, 2012

Extending Date Parsing In Ruby 1.9.3


I had previously made posts about parsing user supplied dates in Ruby



Apparently in Ruby 1.9.3 the Date library was re-implemented in C for performance and of course that broke my extension.  I updated it to support Ruby 1.9.3 below


require 'date'
class Date
class << self
def convert_date_string(input)
# mm-dd-yyyy
if input =~ /^(\d{1,2})[^\d\w\s](\d{1,2})[^\d\w\s](\d{4})([T|\W].*)?/
"%0.4d/%0.2d/%0.2d#{$4}" % [$3, $1, $2].map(&:to_i)
# mm-dd-yy
elsif input =~ /^(\d{1,2})[^\d\w\s](\d{1,2})[^\d\w\s](\d{1,2})([T|\W].*)?/
"%0.4d/%0.2d/%0.2d#{$4}" % ["#{today.century}#{$3}", $1, $2].map(&:to_i)
# mm-dd
elsif input =~ /^(\d{1,2})[^\d\w\s](\d{1,2})([T\W].*)?/i
"%0.4d/%0.2d/%0.2d#{$3}" % [today.year, $1, $2].map(&:to_i)
# 28/Jan
elsif input =~ /^(\d+)[^\w\d]((jan)|(feb)|(mar)|(apr)|(may)|(jun)|(jul)|(aug)|(sep)|(oct)|(nov)|(dec))(\s.*)?/i
"#{$1}/#{$2}#{$3}"
else
input
end
end
alias _original_parse _parse
def _parse(input, comp=true)
_original_parse(convert_date_string(input), comp)
end
alias original_parse parse
def parse(input, comp=true)
original_parse(convert_date_string(input), comp)
end
end
end
view raw gistfile1.rb hosted with ❤ by GitHub


This may not work on Ruby versions prior to 1.9.3 I didn't try it.

I also found the american_date gem which apparently existed before I had originally written my extension and is almost certainly a better choice if you don't need any custom formats.

No comments: