Created
January 10, 2012 03:58
-
-
Save headius/1586832 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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