Skip to content

Instantly share code, notes, and snippets.

@headius
Created January 10, 2012 03:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save headius/1586832 to your computer and use it in GitHub Desktop.
Save headius/1586832 to your computer and use it in GitHub Desktop.
diff --git a/lib/ruby/1.9/date/format.rb b/lib/ruby/1.9/date/format.rb
index b30cf3a..1d04467 100644
--- a/lib/ruby/1.9/date/format.rb
+++ b/lib/ruby/1.9/date/format.rb
@@ -396,64 +396,89 @@ class Date
if s
case s
when 'A', 'a'
+ str.tap do |str|
return unless str.sub!(/\A(#{Format::DAYS.keys.join('|')})/io, '') ||
str.sub!(/\A(#{Format::ABBR_DAYS.keys.join('|')})/io, '')
val = Format::DAYS[$1.downcase] || Format::ABBR_DAYS[$1.downcase]
return unless val
e.wday = val
+ end
when 'B', 'b', 'h'
+ str.tap do |str|
return unless str.sub!(/\A(#{Format::MONTHS.keys.join('|')})/io, '') ||
str.sub!(/\A(#{Format::ABBR_MONTHS.keys.join('|')})/io, '')
val = Format::MONTHS[$1.downcase] || Format::ABBR_MONTHS[$1.downcase]
return unless val
e.mon = val
+ end
when 'C', 'EC'
+ str.tap do |str|
return unless str.sub!(if num_pattern?($')
then /\A([-+]?\d{1,2})/
else /\A([-+]?\d{1,})/
end, '')
val = $1.to_i
e._cent = val
+ end
when 'c', 'Ec'
+ str.tap do |str|
return unless _strptime_i(str, '%a %b %e %H:%M:%S %Y', e)
+ end
when 'D'
+ str.tap do |str|
return unless _strptime_i(str, '%m/%d/%y', e)
+ end
when 'd', 'e', 'Od', 'Oe'
+ str.tap do |str|
return unless str.sub!(/\A( \d|\d{1,2})/, '')
val = $1.to_i
return unless (1..31) === val
e.mday = val
+ end
when 'F'
+ str.tap do |str|
return unless _strptime_i(str, '%Y-%m-%d', e)
+ end
when 'G'
+ str.tap do |str|
return unless str.sub!(if num_pattern?($')
then /\A([-+]?\d{1,4})/
else /\A([-+]?\d{1,})/
end, '')
val = $1.to_i
e.cwyear = val
+ end
when 'g'
+ str.tap do |str|
return unless str.sub!(/\A(\d{1,2})/, '')
val = $1.to_i
return unless (0..99) === val
e.cwyear = val
e._cent ||= if val >= 69 then 19 else 20 end
+ end
when 'H', 'k', 'OH'
+ str.tap do |str|
return unless str.sub!(/\A( \d|\d{1,2})/, '')
val = $1.to_i
return unless (0..24) === val
e.hour = val
+ end
when 'I', 'l', 'OI'
+ str.tap do |str|
return unless str.sub!(/\A( \d|\d{1,2})/, '')
val = $1.to_i
return unless (1..12) === val
e.hour = val
+ end
when 'j'
+ str.tap do |str|
return unless str.sub!(/\A(\d{1,3})/, '')
val = $1.to_i
return unless (1..366) === val
e.yday = val
+ end
when 'L'
+ str.tap do |str|
return unless str.sub!(if num_pattern?($')
then /\A([-+]?\d{1,3})/
else /\A([-+]?\d{1,})/
@@ -461,17 +486,23 @@ class Date
# val = Rational($1.to_i, 10**3)
val = Rational($1.to_i, 10**$1.size)
e.sec_fraction = val
+ end
when 'M', 'OM'
+ str.tap do |str|
return unless str.sub!(/\A(\d{1,2})/, '')
val = $1.to_i
return unless (0..59) === val
e.min = val
+ end
when 'm', 'Om'
+ str.tap do |str|
return unless str.sub!(/\A(\d{1,2})/, '')
val = $1.to_i
return unless (1..12) === val
e.mon = val
+ end
when 'N'
+ str.tap do |str|
return unless str.sub!(if num_pattern?($')
then /\A([-+]?\d{1,9})/
else /\A([-+]?\d{1,})/
@@ -479,70 +510,106 @@ class Date
# val = Rational($1.to_i, 10**9)
val = Rational($1.to_i, 10**$1.size)
e.sec_fraction = val
+ end
when 'n', 't'
+ str.tap do |str|
return unless _strptime_i(str, "\s", e)
+ end
when 'P', 'p'
+ str.tap do |str|
return unless str.sub!(/\A([ap])(?:m\b|\.m\.)/i, '')
e._merid = if $1.downcase == 'a' then 0 else 12 end
+ end
when 'Q'
+ str.tap do |str|
return unless str.sub!(/\A(-?\d{1,})/, '')
val = Rational($1.to_i, 10**3)
e.seconds = val
+ end
when 'R'
+ str.tap do |str|
return unless _strptime_i(str, '%H:%M', e)
+ end
when 'r'
+ str.tap do |str|
return unless _strptime_i(str, '%I:%M:%S %p', e)
+ end
when 'S', 'OS'
+ str.tap do |str|
return unless str.sub!(/\A(\d{1,2})/, '')
val = $1.to_i
return unless (0..60) === val
e.sec = val
+ end
when 's'
+ str.tap do |str|
return unless str.sub!(/\A(-?\d{1,})/, '')
val = $1.to_i
e.seconds = val
+ end
when 'T'
+ str.tap do |str|
return unless _strptime_i(str, '%H:%M:%S', e)
+ end
when 'U', 'W', 'OU', 'OW'
+ str.tap do |str|
return unless str.sub!(/\A(\d{1,2})/, '')
val = $1.to_i
return unless (0..53) === val
e.__send__(if s[-1,1] == 'U' then :wnum0= else :wnum1= end, val)
+ end
when 'u', 'Ou'
+ str.tap do |str|
return unless str.sub!(/\A(\d{1})/, '')
val = $1.to_i
return unless (1..7) === val
e.cwday = val
+ end
when 'V', 'OV'
+ str.tap do |str|
return unless str.sub!(/\A(\d{1,2})/, '')
val = $1.to_i
return unless (1..53) === val
e.cweek = val
+ end
when 'v'
+ str.tap do |str|
return unless _strptime_i(str, '%e-%b-%Y', e)
+ end
when 'w'
+ str.tap do |str|
return unless str.sub!(/\A(\d{1})/, '')
val = $1.to_i
return unless (0..6) === val
e.wday = val
+ end
when 'X', 'EX'
+ str.tap do |str|
return unless _strptime_i(str, '%H:%M:%S', e)
+ end
when 'x', 'Ex'
+ str.tap do |str|
return unless _strptime_i(str, '%m/%d/%y', e)
+ end
when 'Y', 'EY'
+ str.tap do |str|
return unless str.sub!(if num_pattern?($')
then /\A([-+]?\d{1,4})/
else /\A([-+]?\d{1,})/
end, '')
val = $1.to_i
e.year = val
+ end
when 'y', 'Ey', 'Oy'
+ str.tap do |str|
return unless str.sub!(/\A(\d{1,2})/, '')
val = $1.to_i
return unless (0..99) === val
e.year = val
e._cent ||= if val >= 69 then 19 else 20 end
+ end
when 'Z', /\A:{0,3}z/
+ str.tap do |str|
return unless str.sub!(/\A((?:gmt|utc?)?[-+]\d+(?:[,.:]\d+(?::\d+)?)?
|[[:alpha:].\s]+(?:standard|daylight)\s+time\b
|[[:alpha:]]+(?:\s+dst)?\b
@@ -551,10 +618,15 @@ class Date
e.zone = val
offset = zone_to_diff(val)
e.offset = offset
+ end
when '%'
+ str.tap do |str|
return unless str.sub!(/\A%/, '')
+ end
when '+'
+ str.tap do |str|
return unless _strptime_i(str, '%a %b %e %H:%M:%S %Z %Y', e)
+ end
else
return unless str.sub!(Regexp.new('\\A' + Regexp.quote(a)), '')
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment