mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/date/date_core.c: replacement of implementation of
_parse. [experimental] * ext/date/date_parse.c: new. * ext/date/lib/date/format.rb: removed ruby version of _parse. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31322 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d5b4cf7f79
commit
448e0d6668
4 changed files with 1463 additions and 598 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
Sat Apr 23 21:29:42 2011 Tadayoshi Funaba <tadf@dotrb.org>
|
||||||
|
|
||||||
|
* ext/date/date_core.c: replacement of implementation of
|
||||||
|
_parse. [experimental]
|
||||||
|
* ext/date/date_parse.c: new.
|
||||||
|
* ext/date/lib/date/format.rb: removed ruby version of _parse.
|
||||||
|
|
||||||
Fri Apr 22 12:04:15 2011 NARUSE, Yui <naruse@ruby-lang.org>
|
Fri Apr 22 12:04:15 2011 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* array.c (rb_ary_sort_bang): fix rdoc.
|
* array.c (rb_ary_sort_bang): fix rdoc.
|
||||||
|
|
|
@ -1417,7 +1417,7 @@ date_s__strptime_internal(int argc, VALUE *argv, VALUE klass,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* Date._strptime(string, [format="%F"])
|
* Date._strptime(string[, format="%F"])
|
||||||
*
|
*
|
||||||
* Return a hash of parsed elements.
|
* Return a hash of parsed elements.
|
||||||
*/
|
*/
|
||||||
|
@ -1427,6 +1427,50 @@ date_s__strptime(int argc, VALUE *argv, VALUE klass)
|
||||||
return date_s__strptime_internal(argc, argv, klass, "%F");
|
return date_s__strptime_internal(argc, argv, klass, "%F");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VALUE
|
||||||
|
date__parse(VALUE str, VALUE comp);
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
date_s__parse_internal(int argc, VALUE *argv, VALUE klass)
|
||||||
|
{
|
||||||
|
VALUE vstr, vcomp, hash;
|
||||||
|
const char *str;
|
||||||
|
|
||||||
|
rb_scan_args(argc, argv, "11", &vstr, &vcomp);
|
||||||
|
StringValue(vstr);
|
||||||
|
if (!rb_enc_str_asciicompat_p(vstr))
|
||||||
|
rb_raise(rb_eArgError,
|
||||||
|
"string should have ASCII compatible encoding");
|
||||||
|
str = RSTRING_PTR(vstr);
|
||||||
|
if (argc < 2)
|
||||||
|
vcomp = Qtrue;
|
||||||
|
|
||||||
|
hash = date__parse(vstr, vcomp);
|
||||||
|
|
||||||
|
{
|
||||||
|
VALUE zone = rb_hash_aref(hash, ID2SYM(rb_intern("zone")));
|
||||||
|
|
||||||
|
if (!NIL_P(zone)) {
|
||||||
|
rb_enc_copy(zone, vstr);
|
||||||
|
rb_hash_aset(hash, ID2SYM(rb_intern("zone")), zone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call-seq:
|
||||||
|
* Date._parse(string[, comp=true])
|
||||||
|
*
|
||||||
|
* Return a hash of parsed elements.
|
||||||
|
*/
|
||||||
|
static VALUE
|
||||||
|
date_s__parse(int argc, VALUE *argv, VALUE klass)
|
||||||
|
{
|
||||||
|
return date_s__parse_internal(argc, argv, klass);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* d.ajd
|
* d.ajd
|
||||||
|
@ -3155,7 +3199,7 @@ datetime_s_now(int argc, VALUE *argv, VALUE klass)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* DateTime._strptime(string, [format="%FT%T%z"])
|
* DateTime._strptime(string[, format="%FT%T%z"])
|
||||||
*
|
*
|
||||||
* Return a hash of parsed elements.
|
* Return a hash of parsed elements.
|
||||||
*/
|
*/
|
||||||
|
@ -4454,6 +4498,7 @@ Init_date_core(void)
|
||||||
rb_define_singleton_method(cDate, "commercial", date_s_commercial, -1);
|
rb_define_singleton_method(cDate, "commercial", date_s_commercial, -1);
|
||||||
rb_define_singleton_method(cDate, "today", date_s_today, -1);
|
rb_define_singleton_method(cDate, "today", date_s_today, -1);
|
||||||
rb_define_singleton_method(cDate, "_strptime", date_s__strptime, -1);
|
rb_define_singleton_method(cDate, "_strptime", date_s__strptime, -1);
|
||||||
|
rb_define_singleton_method(cDate, "_parse", date_s__parse, -1);
|
||||||
|
|
||||||
rb_define_method(cDate, "ajd", d_lite_ajd, 0);
|
rb_define_method(cDate, "ajd", d_lite_ajd, 0);
|
||||||
rb_define_method(cDate, "amjd", d_lite_amjd, 0);
|
rb_define_method(cDate, "amjd", d_lite_amjd, 0);
|
||||||
|
|
1349
ext/date/date_parse.c
Normal file
1349
ext/date/date_parse.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
||||||
# format.rb: Written by Tadayoshi Funaba 1999-2010
|
# format.rb: Written by Tadayoshi Funaba 1999-2011
|
||||||
|
|
||||||
class Date
|
class Date
|
||||||
|
|
||||||
|
@ -108,31 +108,8 @@ class Date
|
||||||
x.freeze
|
x.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
class BagStruct < Struct # :nodoc:
|
|
||||||
|
|
||||||
def to_hash
|
|
||||||
h = {}
|
|
||||||
members.each do |k|
|
|
||||||
unless /\A_/ =~ k.to_s || self[k].nil?
|
|
||||||
h[k] = self[k]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
h
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
Bag = BagStruct.new(:year, :mon, :yday, :mday, :wday,
|
|
||||||
:cwyear, :cweek, :cwday,
|
|
||||||
:hour, :min, :sec, :sec_fraction,
|
|
||||||
:wnum0, :wnum1, :seconds,
|
|
||||||
:zone, :offset, :leftover,
|
|
||||||
:_cent, :_merid, :_comp)
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# alias_method :format, :strftime
|
|
||||||
|
|
||||||
def asctime() strftime('%c') end
|
def asctime() strftime('%c') end
|
||||||
|
|
||||||
alias_method :ctime, :asctime
|
alias_method :ctime, :asctime
|
||||||
|
@ -167,512 +144,6 @@ class Date
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
=begin
|
|
||||||
def beat(n=0)
|
|
||||||
i, f = (new_offset(HOURS_IN_DAY).day_fraction * 1000).divmod(1)
|
|
||||||
('@%03d' % i) +
|
|
||||||
if n < 1
|
|
||||||
''
|
|
||||||
else
|
|
||||||
'.%0*d' % [n, (f / Rational(1, 10**n)).round]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
=end
|
|
||||||
|
|
||||||
def self.s3e(e, y, m, d, bc=false)
|
|
||||||
unless String === m
|
|
||||||
m = m.to_s
|
|
||||||
end
|
|
||||||
|
|
||||||
if y && m && !d
|
|
||||||
y, m, d = d, y, m
|
|
||||||
end
|
|
||||||
|
|
||||||
if y == nil
|
|
||||||
if d && d.size > 2
|
|
||||||
y = d
|
|
||||||
d = nil
|
|
||||||
end
|
|
||||||
if d && d[0,1] == "'"
|
|
||||||
y = d
|
|
||||||
d = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if y
|
|
||||||
y.scan(/(\d+)(.+)?/)
|
|
||||||
if $2
|
|
||||||
y, d = d, $1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if m
|
|
||||||
if m[0,1] == "'" || m.size > 2
|
|
||||||
y, m, d = m, d, y # us -> be
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if d
|
|
||||||
if d[0,1] == "'" || d.size > 2
|
|
||||||
y, d = d, y
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if y
|
|
||||||
y =~ /([-+])?(\d+)/
|
|
||||||
if $1 || $2.size > 2
|
|
||||||
c = false
|
|
||||||
end
|
|
||||||
iy = $&.to_i
|
|
||||||
if bc
|
|
||||||
iy = -iy + 1
|
|
||||||
end
|
|
||||||
e.year = iy
|
|
||||||
end
|
|
||||||
|
|
||||||
if m
|
|
||||||
m =~ /\d+/
|
|
||||||
e.mon = $&.to_i
|
|
||||||
end
|
|
||||||
|
|
||||||
if d
|
|
||||||
d =~ /\d+/
|
|
||||||
e.mday = $&.to_i
|
|
||||||
end
|
|
||||||
|
|
||||||
if c != nil
|
|
||||||
e._comp = c
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
private_class_method :s3e
|
|
||||||
|
|
||||||
def self._parse_day(str, e) # :nodoc:
|
|
||||||
if str.sub!(/\b(#{Format::ABBR_DAYS.keys.join('|')})[^-\d\s]*/io, ' ')
|
|
||||||
e.wday = Format::ABBR_DAYS[$1.downcase]
|
|
||||||
true
|
|
||||||
=begin
|
|
||||||
elsif str.sub!(/\b(?!\dth)(su|mo|tu|we|th|fr|sa)\b/i, ' ')
|
|
||||||
e.wday = %w(su mo tu we th fr sa).index($1.downcase)
|
|
||||||
true
|
|
||||||
=end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_time(str, e) # :nodoc:
|
|
||||||
if str.sub!(
|
|
||||||
/(
|
|
||||||
(?:
|
|
||||||
\d+\s*:\s*\d+
|
|
||||||
(?:
|
|
||||||
\s*:\s*\d+(?:[,.]\d*)?
|
|
||||||
)?
|
|
||||||
|
|
|
||||||
\d+\s*h(?:\s*\d+m?(?:\s*\d+s?)?)?
|
|
||||||
)
|
|
||||||
(?:
|
|
||||||
\s*
|
|
||||||
[ap](?:m\b|\.m\.)
|
|
||||||
)?
|
|
||||||
|
|
|
||||||
\d+\s*[ap](?:m\b|\.m\.)
|
|
||||||
)
|
|
||||||
(?:
|
|
||||||
\s*
|
|
||||||
(
|
|
||||||
(?:gmt|utc?)?[-+]\d+(?:[,.:]\d+(?::\d+)?)?
|
|
||||||
|
|
|
||||||
[[:alpha:].\s]+(?:standard|daylight)\stime\b
|
|
||||||
|
|
|
||||||
[[:alpha:]]+(?:\sdst)?\b
|
|
||||||
)
|
|
||||||
)?
|
|
||||||
/ix,
|
|
||||||
' ')
|
|
||||||
|
|
||||||
t = $1
|
|
||||||
e.zone = $2 if $2
|
|
||||||
|
|
||||||
t =~ /\A(\d+)h?
|
|
||||||
(?:\s*:?\s*(\d+)m?
|
|
||||||
(?:
|
|
||||||
\s*:?\s*(\d+)(?:[,.](\d+))?s?
|
|
||||||
)?
|
|
||||||
)?
|
|
||||||
(?:\s*([ap])(?:m\b|\.m\.))?/ix
|
|
||||||
|
|
||||||
e.hour = $1.to_i
|
|
||||||
e.min = $2.to_i if $2
|
|
||||||
e.sec = $3.to_i if $3
|
|
||||||
e.sec_fraction = Rational($4.to_i, 10**$4.size) if $4
|
|
||||||
|
|
||||||
if $5
|
|
||||||
e.hour %= 12
|
|
||||||
if $5.downcase == 'p'
|
|
||||||
e.hour += 12
|
|
||||||
end
|
|
||||||
end
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
=begin
|
|
||||||
def self._parse_beat(str, e) # :nodoc:
|
|
||||||
if str.sub!(/@\s*(\d+)(?:[,.](\d*))?/, ' ')
|
|
||||||
beat = Rational($1.to_i)
|
|
||||||
beat += Rational($2.to_i, 10**$2.size) if $2
|
|
||||||
secs = Rational(beat, 1000)
|
|
||||||
h, min, s, fr = self.day_fraction_to_time(secs)
|
|
||||||
e.hour = h
|
|
||||||
e.min = min
|
|
||||||
e.sec = s
|
|
||||||
e.sec_fraction = fr * 86400
|
|
||||||
e.zone = '+01:00'
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
=end
|
|
||||||
|
|
||||||
def self._parse_eu(str, e) # :nodoc:
|
|
||||||
if str.sub!(
|
|
||||||
/'?(\d+)[^-\d\s]*
|
|
||||||
\s*
|
|
||||||
(#{Format::ABBR_MONTHS.keys.join('|')})[^-\d\s']*
|
|
||||||
(?:
|
|
||||||
\s*
|
|
||||||
(c(?:e|\.e\.)|b(?:ce|\.c\.e\.)|a(?:d|\.d\.)|b(?:c|\.c\.))?
|
|
||||||
\s*
|
|
||||||
('?-?\d+(?:(?:st|nd|rd|th)\b)?)
|
|
||||||
)?
|
|
||||||
/iox,
|
|
||||||
' ') # '
|
|
||||||
s3e(e, $4, Format::ABBR_MONTHS[$2.downcase], $1,
|
|
||||||
$3 && $3[0,1].downcase == 'b')
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_us(str, e) # :nodoc:
|
|
||||||
if str.sub!(
|
|
||||||
/\b(#{Format::ABBR_MONTHS.keys.join('|')})[^-\d\s']*
|
|
||||||
\s*
|
|
||||||
('?\d+)[^-\d\s']*
|
|
||||||
(?:
|
|
||||||
\s*
|
|
||||||
(c(?:e|\.e\.)|b(?:ce|\.c\.e\.)|a(?:d|\.d\.)|b(?:c|\.c\.))?
|
|
||||||
\s*
|
|
||||||
('?-?\d+)
|
|
||||||
)?
|
|
||||||
/iox,
|
|
||||||
' ') # '
|
|
||||||
s3e(e, $4, Format::ABBR_MONTHS[$1.downcase], $2,
|
|
||||||
$3 && $3[0,1].downcase == 'b')
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_iso(str, e) # :nodoc:
|
|
||||||
if str.sub!(/('?[-+]?\d+)-(\d+)-('?-?\d+)/, ' ')
|
|
||||||
s3e(e, $1, $2, $3)
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_iso2(str, e) # :nodoc:
|
|
||||||
if str.sub!(/\b(\d{2}|\d{4})?-?w(\d{2})(?:-?(\d))?\b/i, ' ')
|
|
||||||
e.cwyear = $1.to_i if $1
|
|
||||||
e.cweek = $2.to_i
|
|
||||||
e.cwday = $3.to_i if $3
|
|
||||||
true
|
|
||||||
elsif str.sub!(/-w-(\d)\b/i, ' ')
|
|
||||||
e.cwday = $1.to_i
|
|
||||||
true
|
|
||||||
elsif str.sub!(/--(\d{2})?-(\d{2})\b/, ' ')
|
|
||||||
e.mon = $1.to_i if $1
|
|
||||||
e.mday = $2.to_i
|
|
||||||
true
|
|
||||||
elsif str.sub!(/--(\d{2})(\d{2})?\b/, ' ')
|
|
||||||
e.mon = $1.to_i
|
|
||||||
e.mday = $2.to_i if $2
|
|
||||||
true
|
|
||||||
elsif /[,.](\d{2}|\d{4})-\d{3}\b/ !~ str &&
|
|
||||||
str.sub!(/\b(\d{2}|\d{4})-(\d{3})\b/, ' ')
|
|
||||||
e.year = $1.to_i
|
|
||||||
e.yday = $2.to_i
|
|
||||||
true
|
|
||||||
elsif /\d-\d{3}\b/ !~ str &&
|
|
||||||
str.sub!(/\b-(\d{3})\b/, ' ')
|
|
||||||
e.yday = $1.to_i
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_jis(str, e) # :nodoc:
|
|
||||||
if str.sub!(/\b([mtsh])(\d+)\.(\d+)\.(\d+)/i, ' ')
|
|
||||||
era = { 'm'=>1867,
|
|
||||||
't'=>1911,
|
|
||||||
's'=>1925,
|
|
||||||
'h'=>1988
|
|
||||||
}[$1.downcase]
|
|
||||||
e.year = $2.to_i + era
|
|
||||||
e.mon = $3.to_i
|
|
||||||
e.mday = $4.to_i
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_vms(str, e) # :nodoc:
|
|
||||||
if str.sub!(/('?-?\d+)-(#{Format::ABBR_MONTHS.keys.join('|')})[^-]*
|
|
||||||
-('?-?\d+)/iox, ' ')
|
|
||||||
s3e(e, $3, Format::ABBR_MONTHS[$2.downcase], $1)
|
|
||||||
true
|
|
||||||
elsif str.sub!(/\b(#{Format::ABBR_MONTHS.keys.join('|')})[^-]*
|
|
||||||
-('?-?\d+)(?:-('?-?\d+))?/iox, ' ')
|
|
||||||
s3e(e, $3, Format::ABBR_MONTHS[$1.downcase], $2)
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_sla(str, e) # :nodoc:
|
|
||||||
if str.sub!(%r|('?-?\d+)/\s*('?\d+)(?:\D\s*('?-?\d+))?|, ' ') # '
|
|
||||||
s3e(e, $1, $2, $3)
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_dot(str, e) # :nodoc:
|
|
||||||
if str.sub!(%r|('?-?\d+)\.\s*('?\d+)\.\s*('?-?\d+)|, ' ') # '
|
|
||||||
s3e(e, $1, $2, $3)
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_year(str, e) # :nodoc:
|
|
||||||
if str.sub!(/'(\d+)\b/, ' ')
|
|
||||||
e.year = $1.to_i
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_mon(str, e) # :nodoc:
|
|
||||||
if str.sub!(/\b(#{Format::ABBR_MONTHS.keys.join('|')})\S*/io, ' ')
|
|
||||||
e.mon = Format::ABBR_MONTHS[$1.downcase]
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_mday(str, e) # :nodoc:
|
|
||||||
if str.sub!(/(\d+)(st|nd|rd|th)\b/i, ' ')
|
|
||||||
e.mday = $1.to_i
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._parse_ddd(str, e) # :nodoc:
|
|
||||||
if str.sub!(
|
|
||||||
/([-+]?)(\d{2,14})
|
|
||||||
(?:
|
|
||||||
\s*
|
|
||||||
t?
|
|
||||||
\s*
|
|
||||||
(\d{2,6})?(?:[,.](\d*))?
|
|
||||||
)?
|
|
||||||
(?:
|
|
||||||
\s*
|
|
||||||
(
|
|
||||||
z\b
|
|
||||||
|
|
|
||||||
[-+]\d{1,4}\b
|
|
||||||
|
|
|
||||||
\[[-+]?\d[^\]]*\]
|
|
||||||
)
|
|
||||||
)?
|
|
||||||
/ix,
|
|
||||||
' ')
|
|
||||||
case $2.size
|
|
||||||
when 2
|
|
||||||
if $3.nil? && $4
|
|
||||||
e.sec = $2[-2, 2].to_i
|
|
||||||
else
|
|
||||||
e.mday = $2[ 0, 2].to_i
|
|
||||||
end
|
|
||||||
when 4
|
|
||||||
if $3.nil? && $4
|
|
||||||
e.sec = $2[-2, 2].to_i
|
|
||||||
e.min = $2[-4, 2].to_i
|
|
||||||
else
|
|
||||||
e.mon = $2[ 0, 2].to_i
|
|
||||||
e.mday = $2[ 2, 2].to_i
|
|
||||||
end
|
|
||||||
when 6
|
|
||||||
if $3.nil? && $4
|
|
||||||
e.sec = $2[-2, 2].to_i
|
|
||||||
e.min = $2[-4, 2].to_i
|
|
||||||
e.hour = $2[-6, 2].to_i
|
|
||||||
else
|
|
||||||
e.year = ($1 + $2[ 0, 2]).to_i
|
|
||||||
e.mon = $2[ 2, 2].to_i
|
|
||||||
e.mday = $2[ 4, 2].to_i
|
|
||||||
end
|
|
||||||
when 8, 10, 12, 14
|
|
||||||
if $3.nil? && $4
|
|
||||||
e.sec = $2[-2, 2].to_i
|
|
||||||
e.min = $2[-4, 2].to_i
|
|
||||||
e.hour = $2[-6, 2].to_i
|
|
||||||
e.mday = $2[-8, 2].to_i
|
|
||||||
if $2.size >= 10
|
|
||||||
e.mon = $2[-10, 2].to_i
|
|
||||||
end
|
|
||||||
if $2.size == 12
|
|
||||||
e.year = ($1 + $2[-12, 2]).to_i
|
|
||||||
end
|
|
||||||
if $2.size == 14
|
|
||||||
e.year = ($1 + $2[-14, 4]).to_i
|
|
||||||
e._comp = false
|
|
||||||
end
|
|
||||||
else
|
|
||||||
e.year = ($1 + $2[ 0, 4]).to_i
|
|
||||||
e.mon = $2[ 4, 2].to_i
|
|
||||||
e.mday = $2[ 6, 2].to_i
|
|
||||||
e.hour = $2[ 8, 2].to_i if $2.size >= 10
|
|
||||||
e.min = $2[10, 2].to_i if $2.size >= 12
|
|
||||||
e.sec = $2[12, 2].to_i if $2.size >= 14
|
|
||||||
e._comp = false
|
|
||||||
end
|
|
||||||
when 3
|
|
||||||
if $3.nil? && $4
|
|
||||||
e.sec = $2[-2, 2].to_i
|
|
||||||
e.min = $2[-3, 1].to_i
|
|
||||||
else
|
|
||||||
e.yday = $2[ 0, 3].to_i
|
|
||||||
end
|
|
||||||
when 5
|
|
||||||
if $3.nil? && $4
|
|
||||||
e.sec = $2[-2, 2].to_i
|
|
||||||
e.min = $2[-4, 2].to_i
|
|
||||||
e.hour = $2[-5, 1].to_i
|
|
||||||
else
|
|
||||||
e.year = ($1 + $2[ 0, 2]).to_i
|
|
||||||
e.yday = $2[ 2, 3].to_i
|
|
||||||
end
|
|
||||||
when 7
|
|
||||||
if $3.nil? && $4
|
|
||||||
e.sec = $2[-2, 2].to_i
|
|
||||||
e.min = $2[-4, 2].to_i
|
|
||||||
e.hour = $2[-6, 2].to_i
|
|
||||||
e.mday = $2[-7, 1].to_i
|
|
||||||
else
|
|
||||||
e.year = ($1 + $2[ 0, 4]).to_i
|
|
||||||
e.yday = $2[ 4, 3].to_i
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if $3
|
|
||||||
if $4
|
|
||||||
case $3.size
|
|
||||||
when 2, 4, 6
|
|
||||||
e.sec = $3[-2, 2].to_i
|
|
||||||
e.min = $3[-4, 2].to_i if $3.size >= 4
|
|
||||||
e.hour = $3[-6, 2].to_i if $3.size >= 6
|
|
||||||
end
|
|
||||||
else
|
|
||||||
case $3.size
|
|
||||||
when 2, 4, 6
|
|
||||||
e.hour = $3[ 0, 2].to_i
|
|
||||||
e.min = $3[ 2, 2].to_i if $3.size >= 4
|
|
||||||
e.sec = $3[ 4, 2].to_i if $3.size >= 6
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if $4
|
|
||||||
e.sec_fraction = Rational($4.to_i, 10**$4.size)
|
|
||||||
end
|
|
||||||
if $5
|
|
||||||
e.zone = $5
|
|
||||||
if e.zone[0,1] == '['
|
|
||||||
o, n, = e.zone[1..-2].split(':')
|
|
||||||
e.zone = n || o
|
|
||||||
if /\A\d/ =~ o
|
|
||||||
o = format('+%s', o)
|
|
||||||
end
|
|
||||||
e.offset = zone_to_diff(o)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private_class_method :_parse_day, :_parse_time, # :_parse_beat,
|
|
||||||
:_parse_eu, :_parse_us, :_parse_iso, :_parse_iso2,
|
|
||||||
:_parse_jis, :_parse_vms, :_parse_sla, :_parse_dot,
|
|
||||||
:_parse_year, :_parse_mon, :_parse_mday, :_parse_ddd
|
|
||||||
|
|
||||||
def self._parse(str, comp=true)
|
|
||||||
str = str.dup
|
|
||||||
|
|
||||||
e = Format::Bag.new
|
|
||||||
|
|
||||||
e._comp = comp
|
|
||||||
|
|
||||||
str.gsub!(/[^-+',.\/:@[:alnum:]\[\]]+/, ' ')
|
|
||||||
|
|
||||||
_parse_time(str, e) # || _parse_beat(str, e)
|
|
||||||
_parse_day(str, e)
|
|
||||||
|
|
||||||
_parse_eu(str, e) ||
|
|
||||||
_parse_us(str, e) ||
|
|
||||||
_parse_iso(str, e) ||
|
|
||||||
_parse_jis(str, e) ||
|
|
||||||
_parse_vms(str, e) ||
|
|
||||||
_parse_sla(str, e) ||
|
|
||||||
_parse_dot(str, e) ||
|
|
||||||
_parse_iso2(str, e) ||
|
|
||||||
_parse_year(str, e) ||
|
|
||||||
_parse_mon(str, e) ||
|
|
||||||
_parse_mday(str, e) ||
|
|
||||||
_parse_ddd(str, e)
|
|
||||||
|
|
||||||
if str.sub!(/\b(bc\b|bce\b|b\.c\.|b\.c\.e\.)/i, ' ')
|
|
||||||
if e.year
|
|
||||||
e.year = -e.year + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if str.sub!(/\A\s*(\d{1,2})\s*\z/, ' ')
|
|
||||||
if e.hour && !e.mday
|
|
||||||
v = $1.to_i
|
|
||||||
if (1..31) === v
|
|
||||||
e.mday = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if e.mday && !e.hour
|
|
||||||
v = $1.to_i
|
|
||||||
if (0..24) === v
|
|
||||||
e.hour = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if e._comp
|
|
||||||
if e.cwyear
|
|
||||||
if e.cwyear >= 0 && e.cwyear <= 99
|
|
||||||
e.cwyear += if e.cwyear >= 69
|
|
||||||
then 1900 else 2000 end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if e.year
|
|
||||||
if e.year >= 0 && e.year <= 99
|
|
||||||
e.year += if e.year >= 69
|
|
||||||
then 1900 else 2000 end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
e.offset ||= zone_to_diff(e.zone) if e.zone
|
|
||||||
|
|
||||||
e.to_hash
|
|
||||||
end
|
|
||||||
|
|
||||||
def self._iso8601(str) # :nodoc:
|
def self._iso8601(str) # :nodoc:
|
||||||
if /\A\s*(([-+]?\d{2,}|-)-\d{2}-\d{2}|
|
if /\A\s*(([-+]?\d{2,}|-)-\d{2}-\d{2}|
|
||||||
([-+]?\d{2,})?-\d{3}|
|
([-+]?\d{2,})?-\d{3}|
|
||||||
|
@ -712,42 +183,42 @@ class Date
|
||||||
(?:t
|
(?:t
|
||||||
(\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?)?
|
(\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?)?
|
||||||
(z|[-+]\d{2}:\d{2})?\s*\z/ix =~ str
|
(z|[-+]\d{2}:\d{2})?\s*\z/ix =~ str
|
||||||
e = Format::Bag.new
|
e = {}
|
||||||
e.year = $1.to_i
|
e[:year] = $1.to_i
|
||||||
e.mon = $2.to_i if $2
|
e[:mon] = $2.to_i if $2
|
||||||
e.mday = $3.to_i if $3
|
e[:mday] = $3.to_i if $3
|
||||||
e.hour = $4.to_i if $4
|
e[:hour] = $4.to_i if $4
|
||||||
e.min = $5.to_i if $5
|
e[:min] = $5.to_i if $5
|
||||||
e.sec = $6.to_i if $6
|
e[:sec] = $6.to_i if $6
|
||||||
e.sec_fraction = Rational($7.to_i, 10**$7.size) if $7
|
e[:sec_fraction] = Rational($7.to_i, 10**$7.size) if $7
|
||||||
if $8
|
if $8
|
||||||
e.zone = $8
|
e[:zone] = $8
|
||||||
e.offset = zone_to_diff($8)
|
e[:offset] = zone_to_diff($8)
|
||||||
end
|
end
|
||||||
e.to_hash
|
e
|
||||||
elsif /\A\s*(\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?
|
elsif /\A\s*(\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?
|
||||||
(z|[-+]\d{2}:\d{2})?\s*\z/ix =~ str
|
(z|[-+]\d{2}:\d{2})?\s*\z/ix =~ str
|
||||||
e = Format::Bag.new
|
e = {}
|
||||||
e.hour = $1.to_i if $1
|
e[:hour] = $1.to_i if $1
|
||||||
e.min = $2.to_i if $2
|
e[:min] = $2.to_i if $2
|
||||||
e.sec = $3.to_i if $3
|
e[:sec] = $3.to_i if $3
|
||||||
e.sec_fraction = Rational($4.to_i, 10**$4.size) if $4
|
e[:sec_fraction] = Rational($4.to_i, 10**$4.size) if $4
|
||||||
if $5
|
if $5
|
||||||
e.zone = $5
|
e[:zone] = $5
|
||||||
e.offset = zone_to_diff($5)
|
e[:offset] = zone_to_diff($5)
|
||||||
end
|
end
|
||||||
e.to_hash
|
e
|
||||||
elsif /\A\s*(?:--(\d{2})(?:-(\d{2}))?|---(\d{2}))
|
elsif /\A\s*(?:--(\d{2})(?:-(\d{2}))?|---(\d{2}))
|
||||||
(z|[-+]\d{2}:\d{2})?\s*\z/ix =~ str
|
(z|[-+]\d{2}:\d{2})?\s*\z/ix =~ str
|
||||||
e = Format::Bag.new
|
e = {}
|
||||||
e.mon = $1.to_i if $1
|
e[:mon] = $1.to_i if $1
|
||||||
e.mday = $2.to_i if $2
|
e[:mday] = $2.to_i if $2
|
||||||
e.mday = $3.to_i if $3
|
e[:mday] = $3.to_i if $3
|
||||||
if $4
|
if $4
|
||||||
e.zone = $4
|
e[:zone] = $4
|
||||||
e.offset = zone_to_diff($4)
|
e[:offset] = zone_to_diff($4)
|
||||||
end
|
end
|
||||||
e.to_hash
|
e
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -756,7 +227,7 @@ class Date
|
||||||
\d{1,2}\s+
|
\d{1,2}\s+
|
||||||
(?:#{Format::ABBR_MONTHS.keys.join('|')})\s+
|
(?:#{Format::ABBR_MONTHS.keys.join('|')})\s+
|
||||||
-?(\d{2,})\s+ # allow minus, anyway
|
-?(\d{2,})\s+ # allow minus, anyway
|
||||||
\d{2}:\d{2}(:\d{2})?\s*
|
\d{2}:\d{2}(?::\d{2})?\s*
|
||||||
(?:[-+]\d{4}|ut|gmt|e[sd]t|c[sd]t|m[sd]t|p[sd]t|[a-ik-z])\s*\z/iox =~ str
|
(?:[-+]\d{4}|ut|gmt|e[sd]t|c[sd]t|m[sd]t|p[sd]t|[a-ik-z])\s*\z/iox =~ str
|
||||||
e = _parse(str, false)
|
e = _parse(str, false)
|
||||||
if $1.size < 4
|
if $1.size < 4
|
||||||
|
@ -811,48 +282,41 @@ class Date
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
t = Module.new do
|
def self.zone_to_diff(zone) # :nodoc:
|
||||||
|
zone = zone.downcase
|
||||||
private
|
if zone.sub!(/\s+(standard|daylight)\s+time\z/, '')
|
||||||
|
dst = $1 == 'daylight'
|
||||||
def zone_to_diff(zone) # :nodoc:
|
else
|
||||||
zone = zone.downcase
|
dst = zone.sub!(/\s+dst\z/, '')
|
||||||
if zone.sub!(/\s+(standard|daylight)\s+time\z/, '')
|
|
||||||
dst = $1 == 'daylight'
|
|
||||||
else
|
|
||||||
dst = zone.sub!(/\s+dst\z/, '')
|
|
||||||
end
|
|
||||||
if Format::ZONES.include?(zone)
|
|
||||||
offset = Format::ZONES[zone]
|
|
||||||
offset += 3600 if dst
|
|
||||||
elsif zone.sub!(/\A(?:gmt|utc?)?([-+])/, '')
|
|
||||||
sign = $1
|
|
||||||
if zone.include?(':')
|
|
||||||
hour, min, sec, = zone.split(':')
|
|
||||||
elsif zone.include?(',') || zone.include?('.')
|
|
||||||
hour, fr, = zone.split(/[,.]/)
|
|
||||||
min = Rational(fr.to_i, 10**fr.size) * 60
|
|
||||||
else
|
|
||||||
case zone.size
|
|
||||||
when 3
|
|
||||||
hour = zone[0,1]
|
|
||||||
min = zone[1,2]
|
|
||||||
else
|
|
||||||
hour = zone[0,2]
|
|
||||||
min = zone[2,2]
|
|
||||||
sec = zone[4,2]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
offset = hour.to_i * 3600 + min.to_i * 60 + sec.to_i
|
|
||||||
offset *= -1 if sign == '-'
|
|
||||||
end
|
|
||||||
offset
|
|
||||||
end
|
end
|
||||||
|
if Format::ZONES.include?(zone)
|
||||||
|
offset = Format::ZONES[zone]
|
||||||
|
offset += 3600 if dst
|
||||||
|
elsif zone.sub!(/\A(?:gmt|utc?)?([-+])/, '')
|
||||||
|
sign = $1
|
||||||
|
if zone.include?(':')
|
||||||
|
hour, min, sec, = zone.split(':')
|
||||||
|
elsif zone.include?(',') || zone.include?('.')
|
||||||
|
hour, fr, = zone.split(/[,.]/)
|
||||||
|
min = Rational(fr.to_i, 10**fr.size) * 60
|
||||||
|
else
|
||||||
|
if (zone.size % 2) == 1
|
||||||
|
hour = zone[0,1]
|
||||||
|
min = zone[1,2]
|
||||||
|
sec = zone[3,2]
|
||||||
|
else
|
||||||
|
hour = zone[0,2]
|
||||||
|
min = zone[2,2]
|
||||||
|
sec = zone[4,2]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
offset = hour.to_i * 3600 + min.to_i * 60 + sec.to_i
|
||||||
|
offset *= -1 if sign == '-'
|
||||||
|
end
|
||||||
|
offset
|
||||||
end
|
end
|
||||||
|
|
||||||
extend t
|
private_class_method :zone_to_diff
|
||||||
include t
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue