Time serialization/deserialization
Implements the extensions to the Time class that are described in the documentation for the time.rb library.
Time
is an abstraction of dates and times. Time is stored internally as the number of seconds
with fraction since the Epoch, January 1, 1970 00:00 UTC. Also see
the library modules Date
. The Time
class treats
GMT (Greenwich Mean Time) and UTC (Coordinated
Universal Time)[Yes, UTC really does stand for
Coordinated Universal Time. There was a committee
involved.] as equivalent. GMT is the older way of referring to these
baseline times but persists in the names of calls on POSIX systems.
All times may have fraction. Be aware of this fact when comparing times with each other—times that are apparently equal when displayed may be different when compared.
- #
- A
- C
- D
- E
- F
- G
- H
- I
- J
- L
- M
-
- make_time,
- marshal_dump,
- marshal_load,
- mday,
- min,
- mktime,
- mon,
- monday?,
- month,
- month_days
- N
- P
- R
- S
- T
- U
-
- usec,
- utc,
- utc,
- utc?,
- utc_offset
- W
- X
- Y
- Z
ZoneOffset | = | { 'UTC' => 0, # ISO 8601 'Z' => 0, # RFC 822 'UT' => 0, 'GMT' => 0, 'EST' => -5, 'EDT' => -4, 'CST' => -6, 'CDT' => -5, 'MST' => -7, 'MDT' => -6, 'PST' => -8, 'PDT' => -7, # Following definition of military zones is original one. # See RFC 1123 and RFC 2822 for the error in RFC 822. 'A' => +1, 'B' => +2, 'C' => +3, 'D' => +4, 'E' => +5, 'F' => +6, 'G' => +7, 'H' => +8, 'I' => +9, 'K' => +10, 'L' => +11, 'M' => +12, 'N' => -1, 'O' => -2, 'P' => -3, 'Q' => -4, 'R' => -5, 'S' => -6, 'T' => -7, 'U' => -8, 'V' => -9, 'W' => -10, 'X' => -11, 'Y' => -12, } |
LeapYearMonthDays | = | [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] |
CommonYearMonthDays | = | [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] |
MonthValue | = | { 'JAN' => 1, 'FEB' => 2, 'MAR' => 3, 'APR' => 4, 'MAY' => 5, 'JUN' => 6, 'JUL' => 7, 'AUG' => 8, 'SEP' => 9, 'OCT' =>10, 'NOV' =>11, 'DEC' =>12 } |
RFC2822_DAY_NAME | = | [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ] |
RFC2822_MONTH_NAME | = | [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ] |
Unmarshal a dumped Time
object.
Source: show
static VALUE time_load(VALUE klass, VALUE str) { VALUE time = time_s_alloc(klass); time_mload(time, str); return time; }
Creates a new time object with the value given by time, the given number of seconds_with_frac, or seconds and microseconds_with_frac from the Epoch. seconds_with_frac and microseconds_with_frac can be Integer, Float, Rational, or other Numeric. non-portable feature allows the offset to be negative on some systems.
Time.at(0) #=> 1969-12-31 18:00:00 -0600
Time.at(Time.at(0)) #=> 1969-12-31 18:00:00 -0600
Time.at(946702800) #=> 1999-12-31 23:00:00 -0600
Time.at(-284061600) #=> 1960-12-31 00:00:00 -0600
Time.at(946684800.2).usec #=> 200000
Time.at(946684800, 123456.789).nsec #=> 123456789
Source: show
static VALUE time_s_at(int argc, VALUE *argv, VALUE klass) { VALUE time, t; wideval_t timew; if (rb_scan_args(argc, argv, "11", &time, &t) == 2) { time = num_exact(time); t = num_exact(t); timew = wadd(rb_time_magnify(v2w(time)), wmulquoll(v2w(t), TIME_SCALE, 1000000)); t = time_new_timew(klass, timew); } else if (IsTimeval(time)) { struct time_object *tobj, *tobj2; GetTimeval(time, tobj); t = time_new_timew(klass, tobj->timew); GetTimeval(t, tobj2); TIME_COPY_GMT(tobj2, tobj); } else { timew = rb_time_magnify(v2w(num_exact(time))); t = time_new_timew(klass, timew); } return t; }
Creates a time based on given values, interpreted as UTC (GMT). The year
must be specified. Other values default to the minimum value for that field
(and may be nil
or omitted). Months may be specified by
numbers from 1 to 12, or by the three-letter English month names. Hours are
specified on a 24-hour clock (0..23). Raises an ArgumentError
if any values are out of range. Will also accept ten arguments in the order
output by Time#to_a
. sec_with_frac and
usec_with_frac can have a fractional part.
Time.utc(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
Source: show
static VALUE time_s_mkutc(int argc, VALUE *argv, VALUE klass) { return time_utc_or_local(argc, argv, TRUE, klass); }
Deserializes JSON string by converting time since epoch to Time
# File ../ruby/ext/json/lib/json/add/core.rb, line 35 def self.json_create(object) if usec = object.delete('u') # used to be tv_usec -> tv_nsec object['n'] = usec * 1000 end if instance_methods.include?(:tv_nsec) at(object['s'], Rational(object['n'], 1000)) else at(object['s'], object['n'] / 1000) end end
Same as Time::gm
, but interprets the values in the local time
zone.
Time.local(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 -0600
Source: show
static VALUE time_s_mktime(int argc, VALUE *argv, VALUE klass) { return time_utc_or_local(argc, argv, FALSE, klass); }
Same as Time::gm
, but interprets the values in the local time
zone.
Time.local(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 -0600
Source: show
static VALUE time_s_mktime(int argc, VALUE *argv, VALUE klass) { return time_utc_or_local(argc, argv, FALSE, klass); }
Returns a Time
object.
It is initialized to the current system time if no argument. Note: The object created will be created using the resolution available on your system clock, and so may include fractional seconds.
If one or more arguments specified, the time is initialized to the specified time. sec may have fraction if it is a rational.
utc_offset is the offset from UTC. It is a string such as “+09:00” or a number of seconds such as 32400.
a = Time.new #=> 2007-11-19 07:50:02 -0600
b = Time.new #=> 2007-11-19 07:50:02 -0600
a == b #=> false
"%.6f" % a.to_f #=> "1195480202.282373"
"%.6f" % b.to_f #=> "1195480202.283415"
Time.new(2008,6,21, 13,30,0, "+09:00") #=> 2008-06-21 13:30:00 +0900
# A trip for RubyConf 2007
t1 = Time.new(2007,11,1,15,25,0, "+09:00") # JST (Narita)
t2 = Time.new(2007,11,1,12, 5,0, "-05:00") # CDT (Minneapolis)
t3 = Time.new(2007,11,1,13,25,0, "-05:00") # CDT (Minneapolis)
t4 = Time.new(2007,11,1,16,53,0, "-04:00") # EDT (Charlotte)
t5 = Time.new(2007,11,5, 9,24,0, "-05:00") # EST (Charlotte)
t6 = Time.new(2007,11,5,11,21,0, "-05:00") # EST (Detroit)
t7 = Time.new(2007,11,5,13,45,0, "-05:00") # EST (Detroit)
t8 = Time.new(2007,11,6,17,10,0, "+09:00") # JST (Narita)
p((t2-t1)/3600.0) #=> 10.666666666666666
p((t4-t3)/3600.0) #=> 2.466666666666667
p((t6-t5)/3600.0) #=> 1.95
p((t8-t7)/3600.0) #=> 13.416666666666666
Source: show
static VALUE time_init(int argc, VALUE *argv, VALUE time) { if (argc == 0) return time_init_0(time); else return time_init_1(argc, argv, time); }
Synonym for Time.new
. Returns a Time
object
initialized to the current system time.
Source: show
static VALUE time_s_now(VALUE klass) { return rb_class_new_instance(0, NULL, klass); }
Creates a time based on given values, interpreted as UTC (GMT). The year
must be specified. Other values default to the minimum value for that field
(and may be nil
or omitted). Months may be specified by
numbers from 1 to 12, or by the three-letter English month names. Hours are
specified on a 24-hour clock (0..23). Raises an ArgumentError
if any values are out of range. Will also accept ten arguments in the order
output by Time#to_a
. sec_with_frac and
usec_with_frac can have a fractional part.
Time.utc(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
Source: show
static VALUE time_s_mkutc(int argc, VALUE *argv, VALUE klass) { return time_utc_or_local(argc, argv, TRUE, klass); }
Addition—Adds some number of seconds (possibly fractional) to time and returns that value as a new time.
t = Time.now #=> 2007-11-19 08:22:21 -0600
t + (60 * 60 * 24) #=> 2007-11-20 08:22:21 -0600
Source: show
static VALUE time_plus(VALUE time1, VALUE time2) { struct time_object *tobj; GetTimeval(time1, tobj); if (IsTimeval(time2)) { rb_raise(rb_eTypeError, "time + time?"); } return time_add(tobj, time2, 1); }
Difference—Returns a new time that represents the difference between two times, or subtracts the given number of seconds in numeric from time.
t = Time.now #=> 2007-11-19 08:23:10 -0600
t2 = t + 2592000 #=> 2007-12-19 08:23:10 -0600
t2 - t #=> 2592000.0
t2 - 2592000 #=> 2007-11-19 08:23:10 -0600
Source: show
static VALUE time_minus(VALUE time1, VALUE time2) { struct time_object *tobj; GetTimeval(time1, tobj); if (IsTimeval(time2)) { struct time_object *tobj2; GetTimeval(time2, tobj2); return rb_Float(rb_time_unmagnify_to_float(wsub(tobj->timew, tobj2->timew))); } return time_add(tobj, time2, -1); }
Comparison—Compares time with other_time.
t = Time.now #=> 2007-11-19 08:12:12 -0600
t2 = t + 2592000 #=> 2007-12-19 08:12:12 -0600
t <=> t2 #=> -1
t2 <=> t #=> 1
t = Time.now #=> 2007-11-19 08:13:38 -0600
t2 = t + 0.1 #=> 2007-11-19 08:13:38 -0600
t.nsec #=> 98222999
t2.nsec #=> 198222999
t <=> t2 #=> -1
t2 <=> t #=> 1
t <=> t #=> 0
Dump time for marshaling.
Source: show
static VALUE time_dump(int argc, VALUE *argv, VALUE time) { VALUE str; rb_scan_args(argc, argv, "01", 0); str = time_mdump(time); return str; }
Returns a hash, that will be turned into a JSON object and represent this object.
Returns a canonical string representation of time.
Time.now.asctime #=> "Wed Apr 9 08:56:03 2003"
Source: show
static VALUE time_asctime(VALUE time) { return strftimev("%a %b %e %T %Y", time); }
Returns a canonical string representation of time.
Time.now.asctime #=> "Wed Apr 9 08:56:03 2003"
Source: show
static VALUE time_asctime(VALUE time) { return strftimev("%a %b %e %T %Y", time); }
Returns the day of the month (1..n) for time.
t = Time.now #=> 2007-11-19 08:27:03 -0600
t.day #=> 19
t.mday #=> 19
Source: show
static VALUE time_mday(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.mday); }
Returns true
if time occurs during Daylight Saving Time in its time zone.
# CST6CDT:
Time.local(2000, 1, 1).zone #=> "CST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "CDT"
Time.local(2000, 7, 1).isdst #=> true
Time.local(2000, 7, 1).dst? #=> true
# Asia/Tokyo:
Time.local(2000, 1, 1).zone #=> "JST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "JST"
Time.local(2000, 7, 1).isdst #=> false
Time.local(2000, 7, 1).dst? #=> false
Source: show
static VALUE time_isdst(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return tobj->vtm.isdst ? Qtrue : Qfalse; }
Return true
if time and other_time are both
Time
objects with the same seconds and fractional seconds.
Source: show
static VALUE time_eql(VALUE time1, VALUE time2) { struct time_object *tobj1, *tobj2; GetTimeval(time1, tobj1); if (IsTimeval(time2)) { GetTimeval(time2, tobj2); return rb_equal(w2v(tobj1->timew), w2v(tobj2->timew)); } return Qfalse; }
Returns true
if time represents Friday.
t = Time.local(1987, 12, 18) #=> 1987-12-18 00:00:00 -0600
t.friday? #=> true
Source: show
static VALUE time_friday(VALUE time) { wday_p(5); }
Returns a new new_time
object representing time in
UTC.
t = Time.local(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 -0600
t.gmt? #=> false
y = t.getgm #=> 2000-01-02 02:15:01 UTC
y.gmt? #=> true
t == y #=> true
Source: show
static VALUE time_getgmtime(VALUE time) { return time_gmtime(time_dup(time)); }
Returns a new new_time
object representing time in
local time (using the local time zone in effect for this process).
If utc_offset is given, it is used instead of the local time.
t = Time.utc(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
l = t.getlocal #=> 2000-01-01 14:15:01 -0600
l.utc? #=> false
t == l #=> true
j = t.getlocal("+09:00") #=> 2000-01-02 05:15:01 +0900
j.utc? #=> false
t == j #=> true
Source: show
static VALUE time_getlocaltime(int argc, VALUE *argv, VALUE time) { VALUE off; rb_scan_args(argc, argv, "01", &off); if (!NIL_P(off)) { off = utc_offset_arg(off); validate_utc_offset(off); time = time_dup(time); time_set_utc_offset(time, off); return time_fixoff(time); } return time_localtime(time_dup(time)); }
Returns a new new_time
object representing time in
UTC.
t = Time.local(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 -0600
t.gmt? #=> false
y = t.getgm #=> 2000-01-02 02:15:01 UTC
y.gmt? #=> true
t == y #=> true
Source: show
static VALUE time_getgmtime(VALUE time) { return time_gmtime(time_dup(time)); }
Returns true
if time represents a time in UTC (GMT).
t = Time.now #=> 2007-11-19 08:15:23 -0600
t.utc? #=> false
t = Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
t = Time.now #=> 2007-11-19 08:16:03 -0600
t.gmt? #=> false
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt? #=> true
Source: show
static VALUE time_utc_p(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); if (TIME_UTC_P(tobj)) return Qtrue; return Qfalse; }
Returns the offset in seconds between the timezone of time and UTC.
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt_offset #=> 0
l = t.getlocal #=> 2000-01-01 14:15:01 -0600
l.gmt_offset #=> -21600
Source: show
static VALUE time_utc_offset(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); if (TIME_UTC_P(tobj)) { return INT2FIX(0); } else { return tobj->vtm.utc_offset; } }
Converts time to UTC (GMT), modifying the receiver.
t = Time.now #=> 2007-11-19 08:18:31 -0600
t.gmt? #=> false
t.gmtime #=> 2007-11-19 14:18:31 UTC
t.gmt? #=> true
t = Time.now #=> 2007-11-19 08:18:51 -0600
t.utc? #=> false
t.utc #=> 2007-11-19 14:18:51 UTC
t.utc? #=> true
Source: show
static VALUE time_gmtime(VALUE time) { struct time_object *tobj; struct vtm vtm; GetTimeval(time, tobj); if (TIME_UTC_P(tobj)) { if (tobj->tm_got) return time; } else { time_modify(time); } if (!gmtimew(tobj->timew, &vtm)) rb_raise(rb_eArgError, "gmtime error"); tobj->vtm = vtm; tobj->tm_got = 1; TIME_SET_UTC(tobj); return time; }
Returns the offset in seconds between the timezone of time and UTC.
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt_offset #=> 0
l = t.getlocal #=> 2000-01-01 14:15:01 -0600
l.gmt_offset #=> -21600
Source: show
static VALUE time_utc_offset(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); if (TIME_UTC_P(tobj)) { return INT2FIX(0); } else { return tobj->vtm.utc_offset; } }
Return a hash code for this time object.
Source: show
static VALUE time_hash(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return rb_hash(w2v(tobj->timew)); }
Returns the hour of the day (0..23) for time.
t = Time.now #=> 2007-11-19 08:26:20 -0600
t.hour #=> 8
Source: show
static VALUE time_hour(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.hour); }
Parses date
as HTTP-date defined by RFC 2616 and converts it
to a Time object.
ArgumentError is raised if
date
is not compliant with RFC 2616 or Time class cannot represent specified date.
See httpdate for more information on this format.
time library should be required to use this method as follows.
require 'time'
# File ../ruby/lib/time.rb, line 369 def httpdate(date) if /\A\s* (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\x20 (\d{2})\x20 (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20 (\d{4})\x20 (\d{2}):(\d{2}):(\d{2})\x20 GMT \s*\z/ix =~ date self.rfc2822(date) elsif /\A\s* (?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday),\x20 (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d)\x20 (\d\d):(\d\d):(\d\d)\x20 GMT \s*\z/ix =~ date year = $3.to_i if year < 50 year += 2000 else year += 1900 end self.utc(year, $2, $1.to_i, $4.to_i, $5.to_i, $6.to_i) elsif /\A\s* (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\x20 (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20 (\d\d|\x20\d)\x20 (\d\d):(\d\d):(\d\d)\x20 (\d{4}) \s*\z/ix =~ date self.utc($6.to_i, MonthValue[$1.upcase], $2.to_i, $3.to_i, $4.to_i, $5.to_i) else raise ArgumentError.new("not RFC 2616 compliant date: #{date.inspect}") end end
Returns a string representing time. Equivalent to calling
Time#strftime
with a format string of “%Y-%m-%d
%H:%M:%S
%z
'' for a local time and
“%Y-%m-%d
%H:%M:%S
UTC
'' for
a UTC time.
Time.now.to_s #=> "2007-10-05 16:09:51 +0900"
Time.now.utc.to_s #=> "2007-10-05 07:09:51 UTC"
Source: show
static VALUE time_to_s(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); if (TIME_UTC_P(tobj)) return strftimev("%Y-%m-%d %H:%M:%S UTC", time); else return strftimev("%Y-%m-%d %H:%M:%S %z", time); }
Returns true
if time occurs during Daylight Saving Time in its time zone.
# CST6CDT:
Time.local(2000, 1, 1).zone #=> "CST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "CDT"
Time.local(2000, 7, 1).isdst #=> true
Time.local(2000, 7, 1).dst? #=> true
# Asia/Tokyo:
Time.local(2000, 1, 1).zone #=> "JST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "JST"
Time.local(2000, 7, 1).isdst #=> false
Time.local(2000, 7, 1).dst? #=> false
Source: show
static VALUE time_isdst(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return tobj->vtm.isdst ? Qtrue : Qfalse; }
Converts time to local time (using the local time zone in effect for this process) modifying the receiver.
If utc_offset is given, it is used instead of the local time.
t = Time.utc(2000, "jan", 1, 20, 15, 1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
t.localtime #=> 2000-01-01 14:15:01 -0600
t.utc? #=> false
t.localtime("+09:00") #=> 2000-01-02 05:15:01 +0900
t.utc? #=> false
Source: show
static VALUE time_localtime_m(int argc, VALUE *argv, VALUE time) { VALUE off; rb_scan_args(argc, argv, "01", &off); if (!NIL_P(off)) { off = utc_offset_arg(off); validate_utc_offset(off); time_set_utc_offset(time, off); return time_fixoff(time); } return time_localtime(time); }
undocumented
Source: show
static VALUE time_mdump(VALUE time) { struct time_object *tobj; unsigned long p, s; char buf[8]; int i; VALUE str; struct vtm vtm; long year; long usec, nsec; VALUE subsecx, nano, subnano, v; GetTimeval(time, tobj); gmtimew(tobj->timew, &vtm); if (FIXNUM_P(vtm.year)) { year = FIX2LONG(vtm.year); if (year < 1900 || 1900+0xffff < year) rb_raise(rb_eArgError, "year too big to marshal: %ld UTC", year); } else { rb_raise(rb_eArgError, "year too big to marshal"); } subsecx = vtm.subsecx; nano = mulquo(subsecx, INT2FIX(1000000000), INT2FIX(TIME_SCALE)); divmodv(nano, INT2FIX(1), &v, &subnano); nsec = FIX2LONG(v); usec = nsec / 1000; nsec = nsec % 1000; nano = add(LONG2FIX(nsec), subnano); p = 0x1UL << 31 | /* 1 */ TIME_UTC_P(tobj) << 30 | /* 1 */ (year-1900) << 14 | /* 16 */ (vtm.mon-1) << 10 | /* 4 */ vtm.mday << 5 | /* 5 */ vtm.hour; /* 5 */ s = vtm.min << 26 | /* 6 */ vtm.sec << 20 | /* 6 */ usec; /* 20 */ for (i=0; i<4; i++) { buf[i] = (unsigned char)p; p = RSHIFT(p, 8); } for (i=4; i<8; i++) { buf[i] = (unsigned char)s; s = RSHIFT(s, 8); } str = rb_str_new(buf, 8); rb_copy_generic_ivar(str, time); if (!rb_equal(nano, INT2FIX(0))) { if (TYPE(nano) == T_RATIONAL) { rb_ivar_set(str, id_nano_num, RRATIONAL(nano)->num); rb_ivar_set(str, id_nano_den, RRATIONAL(nano)->den); } else { rb_ivar_set(str, id_nano_num, nano); rb_ivar_set(str, id_nano_den, INT2FIX(1)); } } if (nsec) { /* submicro is only for Ruby 1.9.1 compatibility */ /* * submicro is formatted in fixed-point packed BCD (without sign). * It represent digits under microsecond. * For nanosecond resolution, 3 digits (2 bytes) are used. * However it can be longer. * Extra digits are ignored for loading. */ char buf[2]; int len = (int)sizeof(buf); buf[1] = (char)((nsec % 10) << 4); nsec /= 10; buf[0] = (char)(nsec % 10); nsec /= 10; buf[0] |= (char)((nsec % 10) << 4); if (buf[1] == 0) len = 1; rb_ivar_set(str, id_submicro, rb_str_new(buf, len)); } if (!TIME_UTC_P(tobj)) { VALUE off = time_utc_offset(time), div, mod; divmodv(off, INT2FIX(1), &div, &mod); if (rb_equal(mod, INT2FIX(0))) off = rb_Integer(div); rb_ivar_set(str, id_offset, off); } return str; }
undocumented
Source: show
static VALUE time_mload(VALUE time, VALUE str) { struct time_object *tobj; unsigned long p, s; time_t sec; long usec; unsigned char *buf; struct vtm vtm; int i, gmt; long nsec; VALUE submicro, nano_num, nano_den, offset; wideval_t timew; st_data_t data; time_modify(time); #define get_attr(attr, iffound) \ attr = rb_attr_get(str, id_##attr); \ if (!NIL_P(attr)) { \ data = id_##attr; \ iffound; \ st_delete(rb_generic_ivar_table(str), &data, 0); \ } get_attr(nano_num, {}); get_attr(nano_den, {}); get_attr(submicro, {}); get_attr(offset, validate_utc_offset(offset)); #undef get_attr rb_copy_generic_ivar(time, str); StringValue(str); buf = (unsigned char *)RSTRING_PTR(str); if (RSTRING_LEN(str) != 8) { rb_raise(rb_eTypeError, "marshaled time format differ"); } p = s = 0; for (i=0; i<4; i++) { p |= buf[i]<<(8*i); } for (i=4; i<8; i++) { s |= buf[i]<<(8*(i-4)); } if ((p & (1UL<<31)) == 0) { gmt = 0; offset = Qnil; sec = p; usec = s; nsec = usec * 1000; timew = wadd(rb_time_magnify(TIMET2WV(sec)), wmulquoll(WINT2FIXWV(usec), TIME_SCALE, 1000000)); } else { p &= ~(1UL<<31); gmt = (int)((p >> 30) & 0x1); vtm.year = INT2FIX(((int)(p >> 14) & 0xffff) + 1900); vtm.mon = ((int)(p >> 10) & 0xf) + 1; vtm.mday = (int)(p >> 5) & 0x1f; vtm.hour = (int) p & 0x1f; vtm.min = (int)(s >> 26) & 0x3f; vtm.sec = (int)(s >> 20) & 0x3f; vtm.utc_offset = INT2FIX(0); vtm.yday = vtm.wday = 0; vtm.isdst = 0; vtm.zone = ""; usec = (long)(s & 0xfffff); nsec = usec * 1000; vtm.subsecx = mulquo(LONG2FIX(nsec), INT2FIX(TIME_SCALE), LONG2FIX(1000000000)); if (nano_num != Qnil) { VALUE nano = quo(num_exact(nano_num), num_exact(nano_den)); vtm.subsecx = add(vtm.subsecx, mulquo(nano, INT2FIX(TIME_SCALE), LONG2FIX(1000000000))); } else if (submicro != Qnil) { /* for Ruby 1.9.1 compatibility */ unsigned char *ptr; long len; int digit; ptr = (unsigned char*)StringValuePtr(submicro); len = RSTRING_LEN(submicro); nsec = 0; if (0 < len) { if (10 <= (digit = ptr[0] >> 4)) goto end_submicro; nsec += digit * 100; if (10 <= (digit = ptr[0] & 0xf)) goto end_submicro; nsec += digit * 10; } if (1 < len) { if (10 <= (digit = ptr[1] >> 4)) goto end_submicro; nsec += digit; } vtm.subsecx = add(vtm.subsecx, mulquo(LONG2FIX(nsec), INT2FIX(TIME_SCALE), LONG2FIX(1000000000))); end_submicro: ; } timew = timegmw(&vtm); } GetNewTimeval(time, tobj); tobj->gmt = 0; tobj->tm_got = 0; tobj->timew = timew; if (gmt) { TIME_SET_UTC(tobj); } else if (!NIL_P(offset)) { time_set_utc_offset(time, offset); time_fixoff(time); } return time; }
Returns the day of the month (1..n) for time.
t = Time.now #=> 2007-11-19 08:27:03 -0600
t.day #=> 19
t.mday #=> 19
Source: show
static VALUE time_mday(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.mday); }
Returns the minute of the hour (0..59) for time.
t = Time.now #=> 2007-11-19 08:25:51 -0600
t.min #=> 25
Source: show
static VALUE time_min(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.min); }
Returns the month of the year (1..12) for time.
t = Time.now #=> 2007-11-19 08:27:30 -0600
t.mon #=> 11
t.month #=> 11
Source: show
static VALUE time_mon(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.mon); }
Returns true
if time represents Monday.
t = Time.local(2003, 8, 4) #=> 2003-08-04 00:00:00 -0500
p t.monday? #=> true
Source: show
static VALUE time_monday(VALUE time) { wday_p(1); }
Returns the month of the year (1..12) for time.
t = Time.now #=> 2007-11-19 08:27:30 -0600
t.mon #=> 11
t.month #=> 11
Source: show
static VALUE time_mon(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.mon); }
Returns just the number of nanoseconds for time.
t = Time.now #=> 2007-11-17 15:18:03 +0900
"%10.9f" % t.to_f #=> "1195280283.536151409"
t.nsec #=> 536151406
The lowest digit of #to_f and nsec is different because IEEE 754 double is not accurate enough to represent nanoseconds from the Epoch. The accurate value is returned by nsec.
Source: show
static VALUE time_nsec(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return rb_to_int(w2v(wmulquoll(wmod(tobj->timew, WINT2WV(TIME_SCALE)), 1000000000, TIME_SCALE))); }
Parses date
using Date._parse and converts it to a Time object.
If a block is given, the year described in date
is converted
by the block. For example:
Time.parse(...) {|y| 0 <= y && y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
If the upper components of the given time are broken or missing, they are
supplied with those of now
. For the lower components, the
minimum values (1 or 0) are assumed if broken or missing. For example:
# Suppose it is "Thu Nov 29 14:33:20 GMT 2001" now and
# your timezone is GMT:
now = Time.parse("Thu Nov 29 14:33:20 GMT 2001")
Time.parse("16:30", now) #=> 2001-11-29 16:30:00 +0900
Time.parse("7/23", now) #=> 2001-07-23 00:00:00 +0900
Time.parse("Aug 31", now) #=> 2001-08-31 00:00:00 +0900
Time.parse("Aug 2000", now) #=> 2000-08-01 00:00:00 +0900
Since there are numerous conflicts among locally defined timezone abbreviations all over the world, this method is not made to understand all of them. For example, the abbreviation “CST” is used variously as:
-06:00 in America/Chicago,
-05:00 in America/Havana,
+08:00 in Asia/Harbin,
+09:30 in Australia/Darwin,
+10:30 in Australia/Adelaide,
etc.
Based on the fact, this method only understands the timezone abbreviations
described in RFC 822 and the system timezone, in the order named. (i.e. a
definition in RFC 822 overrides the system timezone definition.) The
system timezone is taken from Time.local(year, 1, 1).zone
and
Time.local(year, 7, 1).zone
. If the extracted timezone
abbreviation does not match any of them, it is ignored and the given time
is regarded as a local time.
ArgumentError is raised if Date._parse
cannot extract information from date
or Time class cannot represent specified date.
This method can be used as fail-safe for other parsing methods as:
Time.rfc2822(date) rescue Time.parse(date)
Time.httpdate(date) rescue Time.parse(date)
Time.xmlschema(date) rescue Time.parse(date)
A failure for #parse should be checked, though.
time library should be required to use this method as follows.
require 'time'
# File ../ruby/lib/time.rb, line 263 def parse(date, now=self.now) comp = !block_given? d = Date._parse(date, comp) if !d[:year] && !d[:mon] && !d[:mday] && !d[:hour] && !d[:min] && !d[:sec] && !d[:sec_fraction] raise ArgumentError, "no time information in #{date.inspect}" end year = d[:year] year = yield(year) if year && !comp make_time(year, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now) end
Parses date
as date-time defined by RFC 2822 and converts it
to a Time object. The format is identical to the
date format defined by RFC 822 and updated by RFC 1123.
ArgumentError is raised if
date
is not compliant with RFC 2822 or Time class cannot represent specified date.
See rfc2822 for more information on this format.
time library should be required to use this method as follows.
require 'time'
# File ../ruby/lib/time.rb, line 316 def rfc2822(date) if /\A\s* (?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*,\s*)? (\d{1,2})\s+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+ (\d{2,})\s+ (\d{2})\s* :\s*(\d{2})\s* (?::\s*(\d{2}))?\s+ ([+-]\d{4}| UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])/ix =~ date # Since RFC 2822 permit comments, the regexp has no right anchor. day = $1.to_i mon = MonthValue[$2.upcase] year = $3.to_i hour = $4.to_i min = $5.to_i sec = $6 ? $6.to_i : 0 zone = $7 # following year completion is compliant with RFC 2822. year = if year < 50 2000 + year elsif year < 1000 1900 + year else year end year, mon, day, hour, min, sec = apply_offset(year, mon, day, hour, min, sec, zone_offset(zone)) t = self.utc(year, mon, day, hour, min, sec) t.localtime if !zone_utc?(zone) t else raise ArgumentError.new("not RFC 2822 compliant date: #{date.inspect}") end end
Rounds sub seconds to a given precision in decimal digits (0 digits by default). It returns a new time object. ndigits should be zero or positive integer.
require 'time'
t = Time.utc(2010,3,30, 5,43,"25.123456789".to_r)
p t.iso8601(10) #=> "2010-03-30T05:43:25.1234567890Z"
p t.round.iso8601(10) #=> "2010-03-30T05:43:25.0000000000Z"
p t.round(0).iso8601(10) #=> "2010-03-30T05:43:25.0000000000Z"
p t.round(1).iso8601(10) #=> "2010-03-30T05:43:25.1000000000Z"
p t.round(2).iso8601(10) #=> "2010-03-30T05:43:25.1200000000Z"
p t.round(3).iso8601(10) #=> "2010-03-30T05:43:25.1230000000Z"
p t.round(4).iso8601(10) #=> "2010-03-30T05:43:25.1235000000Z"
p t.round(5).iso8601(10) #=> "2010-03-30T05:43:25.1234600000Z"
p t.round(6).iso8601(10) #=> "2010-03-30T05:43:25.1234570000Z"
p t.round(7).iso8601(10) #=> "2010-03-30T05:43:25.1234568000Z"
p t.round(8).iso8601(10) #=> "2010-03-30T05:43:25.1234567900Z"
p t.round(9).iso8601(10) #=> "2010-03-30T05:43:25.1234567890Z"
p t.round(10).iso8601(10) #=> "2010-03-30T05:43:25.1234567890Z"
t = Time.utc(1999,12,31, 23,59,59)
p((t + 0.4).round.iso8601(3)) #=> "1999-12-31T23:59:59.000Z"
p((t + 0.49).round.iso8601(3)) #=> "1999-12-31T23:59:59.000Z"
p((t + 0.5).round.iso8601(3)) #=> "2000-01-01T00:00:00.000Z"
p((t + 1.4).round.iso8601(3)) #=> "2000-01-01T00:00:00.000Z"
p((t + 1.49).round.iso8601(3)) #=> "2000-01-01T00:00:00.000Z"
p((t + 1.5).round.iso8601(3)) #=> "2000-01-01T00:00:01.000Z"
t = Time.utc(1999,12,31, 23,59,59)
p (t + 0.123456789).round(4).iso8601(6) #=> "1999-12-31T23:59:59.123500Z"
Source: show
static VALUE time_round(int argc, VALUE *argv, VALUE time) { VALUE ndigits, v, a, b, den; long nd; struct time_object *tobj; rb_scan_args(argc, argv, "01", &ndigits); if (NIL_P(ndigits)) ndigits = INT2FIX(0); else ndigits = rb_to_int(ndigits); nd = NUM2LONG(ndigits); if (nd < 0) rb_raise(rb_eArgError, "negative ndigits given"); GetTimeval(time, tobj); v = w2v(rb_time_unmagnify(tobj->timew)); a = INT2FIX(1); b = INT2FIX(10); while (0 < nd) { if (nd & 1) a = mul(a, b); b = mul(b, b); nd = nd >> 1; } den = quo(INT2FIX(1), a); v = mod(v, den); if (lt(v, quo(den, INT2FIX(2)))) return time_add(tobj, v, -1); else return time_add(tobj, sub(den, v), 1); }
Returns true
if time represents Saturday.
t = Time.local(2006, 6, 10) #=> 2006-06-10 00:00:00 -0500
t.saturday? #=> true
Source: show
static VALUE time_saturday(VALUE time) { wday_p(6); }
Returns the second of the minute (0..60)[Yes, seconds really can range from zero to 60. This allows the system to inject leap seconds every now and then to correct for the fact that years are not really a convenient number of hours long.] for time.
t = Time.now #=> 2007-11-19 08:25:02 -0600
t.sec #=> 2
Source: show
static VALUE time_sec(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.sec); }
Formats time according to the directives in the given format string. The directives begins with a percent (%) character. Any text not listed as a directive will be passed through to the output string.
The directive consists of a percent (%) character, zero or more flags, optional minimum field width, optional modifier and a conversion specifier as follows.
%<flags><width><modifier><conversion>
Flags:
- don't pad a numerical output.
_ use spaces for padding.
0 use zeros for padding.
^ upcase the result string.
# change case.
: use colons for %z.
The minimum field width specifies the minimum width.
The modifier is “E” and “O”. They are ignored.
Format directives:
Date (Year, Month, Day):
%Y - Year with century (can be negative, 4 digits at least)
-0001, 0000, 1995, 2009, 14292, etc.
%C - year / 100 (round down. 20 in 2009)
%y - year % 100 (00..99)
%m - Month of the year, zero-padded (01..12)
%_m blank-padded ( 1..12)
%-m no-padded (1..12)
%B - The full month name (``January'')
%^B uppercased (``JANUARY'')
%b - The abbreviated month name (``Jan'')
%^b uppercased (``JAN'')
%h - Equivalent to %b
%d - Day of the month, zero-padded (01..31)
%-d no-padded (1..31)
%e - Day of the month, blank-padded ( 1..31)
%j - Day of the year (001..366)
Time (Hour, Minute, Second, Subsecond):
%H - Hour of the day, 24-hour clock, zero-padded (00..23)
%k - Hour of the day, 24-hour clock, blank-padded ( 0..23)
%I - Hour of the day, 12-hour clock, zero-padded (01..12)
%l - Hour of the day, 12-hour clock, blank-padded ( 1..12)
%P - Meridian indicator, lowercase (``am'' or ``pm'')
%p - Meridian indicator, uppercase (``AM'' or ``PM'')
%M - Minute of the hour (00..59)
%S - Second of the minute (00..60)
%L - Millisecond of the second (000..999)
%N - Fractional seconds digits, default is 9 digits (nanosecond)
%3N millisecond (3 digits)
%6N microsecond (6 digits)
%9N nanosecond (9 digits)
%12N picosecond (12 digits)
Time zone:
%z - Time zone as hour and minute offset from UTC (e.g. +0900)
%:z - hour and minute offset from UTC with a colon (e.g. +09:00)
%::z - hour, minute and second offset from UTC (e.g. +09:00:00)
%Z - Time zone abbreviation name
Weekday:
%A - The full weekday name (``Sunday'')
%^A uppercased (``SUNDAY'')
%a - The abbreviated name (``Sun'')
%^a uppercased (``SUN'')
%u - Day of the week (Monday is 1, 1..7)
%w - Day of the week (Sunday is 0, 0..6)
ISO 8601 week-based year and week number:
The week 1 of YYYY starts with a Monday and includes YYYY-01-04.
The days in the year before the first week are in the last week of
the previous year.
%G - The week-based year
%g - The last 2 digits of the week-based year (00..99)
%V - Week number of the week-based year (01..53)
Week number:
The week 1 of YYYY starts with a Sunday or Monday (according to %U
or %W). The days in the year before the first week are in week 0.
%U - Week number of the year. The week starts with Sunday. (00..53)
%W - Week number of the year. The week starts with Monday. (00..53)
Seconds since the Epoch:
%s - Number of seconds since 1970-01-01 00:00:00 UTC.
Literal string:
%n - Newline character (\n)
%t - Tab character (\t)
%% - Literal ``%'' character
Combination:
%c - date and time (%a %b %e %T %Y)
%D - Date (%m/%d/%y)
%F - The ISO 8601 date format (%Y-%m-%d)
%v - VMS date (%e-%^b-%4Y)
%x - Same as %D
%X - Same as %T
%r - 12-hour time (%I:%M:%S %p)
%R - 24-hour time (%H:%M)
%T - 24-hour time (%H:%M:%S)
This method is similar to strftime() function defined in ISO C and POSIX. Several directives (%a, %A, %b, %B, %c, %p, %r, %x, %X, %E*, %O* and %Z) are locale dependent in the function. However this method is locale independent since Ruby 1.9. So, the result may differ even if a same format string is used in other systems such as C. It is good practice to avoid %x and %X because there are corresponding locale independent representations, %D and %T.
Examples:
t = Time.new(2007,11,19,8,37,48,"-06:00") #=> 2007-11-19 08:37:48 -0600
t.strftime("Printed on %m/%d/%Y") #=> "Printed on 11/19/2007"
t.strftime("at %I:%M%p") #=> "at 08:37AM"
Various ISO 8601 formats:
%Y%m%d => 20071119 Calendar date (basic)
%F => 2007-11-19 Calendar date (extended)
%Y-%m => 2007-11 Calendar date, reduced accuracy, specific month
%Y => 2007 Calendar date, reduced accuracy, specific year
%C => 20 Calendar date, reduced accuracy, specific century
%Y%j => 2007323 Ordinal date (basic)
%Y-%j => 2007-323 Ordinal date (extended)
%GW%V%u => 2007W471 Week date (basic)
%G-W%V-%u => 2007-W47-1 Week date (extended)
%GW%V => 2007W47 Week date, reduced accuracy, specific week (basic)
%G-W%V => 2007-W47 Week date, reduced accuracy, specific week (extended)
%H%M%S => 083748 Local time (basic)
%T => 08:37:48 Local time (extended)
%H%M => 0837 Local time, reduced accuracy, specific minute (basic)
%H:%M => 08:37 Local time, reduced accuracy, specific minute (extended)
%H => 08 Local time, reduced accuracy, specific hour
%H%M%S,%L => 083748,000 Local time with decimal fraction, comma as decimal sign (basic)
%T,%L => 08:37:48,000 Local time with decimal fraction, comma as decimal sign (extended)
%H%M%S.%L => 083748.000 Local time with decimal fraction, full stop as decimal sign (basic)
%T.%L => 08:37:48.000 Local time with decimal fraction, full stop as decimal sign (extended)
%H%M%S%z => 083748-0600 Local time and the difference from UTC (basic)
%T%:z => 08:37:48-06:00 Local time and the difference from UTC (extended)
%Y%m%dT%H%M%S%z => 20071119T083748-0600 Date and time of day for calendar date (basic)
%FT%T%:z => 2007-11-19T08:37:48-06:00 Date and time of day for calendar date (extended)
%Y%jT%H%M%S%z => 2007323T083748-0600 Date and time of day for ordinal date (basic)
%Y-%jT%T%:z => 2007-323T08:37:48-06:00 Date and time of day for ordinal date (extended)
%GW%V%uT%H%M%S%z => 2007W471T083748-0600 Date and time of day for week date (basic)
%G-W%V-%uT%T%:z => 2007-W47-1T08:37:48-06:00 Date and time of day for week date (extended)
%Y%m%dT%H%M => 20071119T0837 Calendar date and local time (basic)
%FT%R => 2007-11-19T08:37 Calendar date and local time (extended)
%Y%jT%H%MZ => 2007323T0837Z Ordinal date and UTC of day (basic)
%Y-%jT%RZ => 2007-323T08:37Z Ordinal date and UTC of day (extended)
%GW%V%uT%H%M%z => 2007W471T0837-0600 Week date and local time and difference from UTC (basic)
%G-W%V-%uT%R%:z => 2007-W47-1T08:37-06:00 Week date and local time and difference from UTC (extended)
Source: show
static VALUE time_strftime(VALUE time, VALUE format) { struct time_object *tobj; char buffer[SMALLBUF], *buf = buffer; const char *fmt; long len; VALUE str; GetTimeval(time, tobj); MAKE_TM(time, tobj); StringValue(format); if (!rb_enc_str_asciicompat_p(format)) { rb_raise(rb_eArgError, "format should have ASCII compatible encoding"); } format = rb_str_new4(format); fmt = RSTRING_PTR(format); len = RSTRING_LEN(format); if (len == 0) { rb_warning("strftime called with empty format string"); } else if (memchr(fmt, '\0', len)) { /* Ruby string may contain \0's. */ const char *p = fmt, *pe = fmt + len; str = rb_str_new(0, 0); while (p < pe) { len = rb_strftime_alloc(&buf, p, &tobj->vtm, tobj->timew, TIME_UTC_P(tobj)); rb_str_cat(str, buf, len); p += strlen(p); if (buf != buffer) { xfree(buf); buf = buffer; } for (fmt = p; p < pe && !*p; ++p); if (p > fmt) rb_str_cat(str, fmt, p - fmt); } return str; } else { len = rb_strftime_alloc(&buf, RSTRING_PTR(format), &tobj->vtm, tobj->timew, TIME_UTC_P(tobj)); } str = rb_str_new(buf, len); if (buf != buffer) xfree(buf); rb_enc_copy(str, format); return str; }
Parses date
using Date._strptime and converts it to a Time object.
If a block is given, the year described in date
is converted
by the block. For example:
Time.strptime(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
# File ../ruby/lib/time.rb, line 281 def strptime(date, format, now=self.now) d = Date._strptime(date, format) raise ArgumentError, "invalid strptime format - `#{format}'" unless d if seconds = d[:seconds] if offset = d[:offset] Time.at(seconds).localtime(offset) else Time.at(seconds) end else year = d[:year] year = yield(year) if year && block_given? make_time(year, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now) end end
Returns just the fraction for time.
The result is possibly rational.
t = Time.now #=> 2009-03-26 22:33:12 +0900
"%10.9f" % t.to_f #=> "1238074392.940563917"
t.subsec #=> (94056401/100000000)
The lowest digit of #to_f and subsec is different because IEEE 754 double is not accurate enough to represent the rational. The accurate value is returned by subsec.
Source: show
static VALUE time_subsec(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return quo(w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE))), INT2FIX(TIME_SCALE)); }
Return a new time object, one second later than time
. #succ is obsolete since 1.9.2 for time
is not a discrete value.
t = Time.now #=> 2007-11-19 08:23:57 -0600
t.succ #=> 2007-11-19 08:23:58 -0600
Source: show
VALUE rb_time_succ(VALUE time) { struct time_object *tobj; struct time_object *tobj2; rb_warn("Time#succ is obsolete; use time + 1"); GetTimeval(time, tobj); time = time_new_timew(rb_cTime, wadd(tobj->timew, WINT2FIXWV(TIME_SCALE))); GetTimeval(time, tobj2); TIME_COPY_GMT(tobj2, tobj); return time; }
Returns true
if time represents Sunday.
t = Time.local(1990, 4, 1) #=> 1990-04-01 00:00:00 -0600
t.sunday? #=> true
Source: show
static VALUE time_sunday(VALUE time) { wday_p(0); }
Returns true
if time represents Thursday.
t = Time.local(1995, 12, 21) #=> 1995-12-21 00:00:00 -0600
p t.thursday? #=> true
Source: show
static VALUE time_thursday(VALUE time) { wday_p(4); }
Returns a ten-element array of values for time: {[
sec, min, hour, day, month, year, wday, yday, isdst, zone ]
}. See
the individual methods for an explanation of the valid ranges of each
value. The ten elements can be passed directly to Time::utc
or
Time::local
to create a new Time
.
t = Time.now #=> 2007-11-19 08:36:01 -0600
now = t.to_a #=> [1, 36, 8, 19, 11, 2007, 1, 323, false, "CST"]
Source: show
static VALUE time_to_a(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return rb_ary_new3(10, INT2FIX(tobj->vtm.sec), INT2FIX(tobj->vtm.min), INT2FIX(tobj->vtm.hour), INT2FIX(tobj->vtm.mday), INT2FIX(tobj->vtm.mon), tobj->vtm.year, INT2FIX(tobj->vtm.wday), INT2FIX(tobj->vtm.yday), tobj->vtm.isdst?Qtrue:Qfalse, time_zone(time)); }
Returns a Date object which denotes self.
Source: show
static VALUE time_to_date(VALUE self) { VALUE y, nth, ret; int ry, m, d; y = f_year(self); m = FIX2INT(f_mon(self)); d = FIX2INT(f_mday(self)); decode_year(y, -1, &nth, &ry); ret = d_simple_new_internal(cDate, nth, 0, GREGORIAN, ry, m, d, HAVE_CIVIL); { get_d1(ret); set_sg(dat, DEFAULT_SG); } return ret; }
Returns a DateTime object which denotes self.
Source: show
static VALUE time_to_datetime(VALUE self) { VALUE y, sf, nth, ret; int ry, m, d, h, min, s, of; y = f_year(self); m = FIX2INT(f_mon(self)); d = FIX2INT(f_mday(self)); h = FIX2INT(f_hour(self)); min = FIX2INT(f_min(self)); s = FIX2INT(f_sec(self)); if (s == 60) s = 59; sf = sec_to_ns(f_subsec(self)); of = FIX2INT(f_utc_offset(self)); decode_year(y, -1, &nth, &ry); ret = d_complex_new_internal(cDateTime, nth, 0, 0, sf, of, DEFAULT_SG, ry, m, d, h, min, s, HAVE_CIVIL | HAVE_TIME); { get_d1(ret); set_sg(dat, DEFAULT_SG); } return ret; }
Returns the value of time as a floating point number of seconds since the Epoch.
t = Time.now
"%10.5f" % t.to_f #=> "1270968744.77658"
t.to_i #=> 1270968744
Note that IEEE 754 double is not accurate enough to represent number of nanoseconds from the Epoch.
Source: show
static VALUE time_to_f(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return rb_Float(rb_time_unmagnify_to_float(tobj->timew)); }
Returns the value of time as an integer number of seconds since the Epoch.
t = Time.now
"%10.5f" % t.to_f #=> "1270968656.89607"
t.to_i #=> 1270968656
Source: show
static VALUE time_to_i(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE))); }
Stores class name (Time) with number of seconds since epoch and number of microseconds for Time as JSON string
Returns the value of time as a rational number of seconds since the Epoch.
t = Time.now
p t.to_r #=> (1270968792716287611/1000000000)
This methods is intended to be used to get an accurate value representing nanoseconds from the Epoch. You can use this to convert time to another Epoch.
Source: show
static VALUE time_to_r(VALUE time) { struct time_object *tobj; VALUE v; GetTimeval(time, tobj); v = w2v(rb_time_unmagnify(tobj->timew)); if (TYPE(v) != T_RATIONAL) { v = rb_Rational1(v); } return v; }
Returns a string representing time. Equivalent to calling
Time#strftime
with a format string of “%Y-%m-%d
%H:%M:%S
%z
'' for a local time and
“%Y-%m-%d
%H:%M:%S
UTC
'' for
a UTC time.
Time.now.to_s #=> "2007-10-05 16:09:51 +0900"
Time.now.utc.to_s #=> "2007-10-05 07:09:51 UTC"
Source: show
static VALUE time_to_s(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); if (TIME_UTC_P(tobj)) return strftimev("%Y-%m-%d %H:%M:%S UTC", time); else return strftimev("%Y-%m-%d %H:%M:%S %z", time); }
Returns a copy of self as local mode.
Source: show
static VALUE time_to_time(VALUE self) { return rb_funcall(self, rb_intern("getlocal"), 0); }
Returns true
if time represents Tuesday.
t = Time.local(1991, 2, 19) #=> 1991-02-19 00:00:00 -0600
p t.tuesday? #=> true
Source: show
static VALUE time_tuesday(VALUE time) { wday_p(2); }
Returns just the number of nanoseconds for time.
t = Time.now #=> 2007-11-17 15:18:03 +0900
"%10.9f" % t.to_f #=> "1195280283.536151409"
t.nsec #=> 536151406
The lowest digit of #to_f and nsec is different because IEEE 754 double is not accurate enough to represent nanoseconds from the Epoch. The accurate value is returned by nsec.
Source: show
static VALUE time_nsec(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return rb_to_int(w2v(wmulquoll(wmod(tobj->timew, WINT2WV(TIME_SCALE)), 1000000000, TIME_SCALE))); }
Returns the value of time as an integer number of seconds since the Epoch.
t = Time.now
"%10.5f" % t.to_f #=> "1270968656.89607"
t.to_i #=> 1270968656
Source: show
static VALUE time_to_i(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE))); }
Returns just the number of microseconds for time.
t = Time.now #=> 2007-11-19 08:03:26 -0600
"%10.6f" % t.to_f #=> "1195481006.775195"
t.usec #=> 775195
Source: show
static VALUE time_usec(VALUE time) { struct time_object *tobj; wideval_t w, q, r; GetTimeval(time, tobj); w = wmod(tobj->timew, WINT2WV(TIME_SCALE)); wmuldivmod(w, WINT2FIXWV(1000000), WINT2FIXWV(TIME_SCALE), &q, &r); return rb_to_int(w2v(q)); }
Returns just the number of microseconds for time.
t = Time.now #=> 2007-11-19 08:03:26 -0600
"%10.6f" % t.to_f #=> "1195481006.775195"
t.usec #=> 775195
Source: show
static VALUE time_usec(VALUE time) { struct time_object *tobj; wideval_t w, q, r; GetTimeval(time, tobj); w = wmod(tobj->timew, WINT2WV(TIME_SCALE)); wmuldivmod(w, WINT2FIXWV(1000000), WINT2FIXWV(TIME_SCALE), &q, &r); return rb_to_int(w2v(q)); }
Converts time to UTC (GMT), modifying the receiver.
t = Time.now #=> 2007-11-19 08:18:31 -0600
t.gmt? #=> false
t.gmtime #=> 2007-11-19 14:18:31 UTC
t.gmt? #=> true
t = Time.now #=> 2007-11-19 08:18:51 -0600
t.utc? #=> false
t.utc #=> 2007-11-19 14:18:51 UTC
t.utc? #=> true
Source: show
static VALUE time_gmtime(VALUE time) { struct time_object *tobj; struct vtm vtm; GetTimeval(time, tobj); if (TIME_UTC_P(tobj)) { if (tobj->tm_got) return time; } else { time_modify(time); } if (!gmtimew(tobj->timew, &vtm)) rb_raise(rb_eArgError, "gmtime error"); tobj->vtm = vtm; tobj->tm_got = 1; TIME_SET_UTC(tobj); return time; }
Returns true
if time represents a time in UTC (GMT).
t = Time.now #=> 2007-11-19 08:15:23 -0600
t.utc? #=> false
t = Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
t = Time.now #=> 2007-11-19 08:16:03 -0600
t.gmt? #=> false
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt? #=> true
Source: show
static VALUE time_utc_p(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); if (TIME_UTC_P(tobj)) return Qtrue; return Qfalse; }
Returns the offset in seconds between the timezone of time and UTC.
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt_offset #=> 0
l = t.getlocal #=> 2000-01-01 14:15:01 -0600
l.gmt_offset #=> -21600
Source: show
static VALUE time_utc_offset(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); if (TIME_UTC_P(tobj)) { return INT2FIX(0); } else { return tobj->vtm.utc_offset; } }
# File ../ruby/lib/rss/rss.rb, line 6 def w3cdtf(date) if /\A\s* (-?\d+)-(\d\d)-(\d\d) (?:T (\d\d):(\d\d)(?::(\d\d))? (\.\d+)? (Z|[+-]\d\d:\d\d)?)? \s*\z/ix =~ date and (($5 and $8) or (!$5 and !$8)) datetime = [$1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i] usec = 0 usec = $7.to_f * 1000000 if $7 zone = $8 if zone off = zone_offset(zone, datetime[0]) datetime = apply_offset(*(datetime + [off])) datetime << usec time = Time.utc(*datetime) time.localtime unless zone_utc?(zone) time else datetime << usec Time.local(*datetime) end else raise ArgumentError.new("invalid date: #{date.inspect}") end end
Returns an integer representing the day of the week, 0..6, with Sunday == 0.
t = Time.now #=> 2007-11-20 02:35:35 -0600
t.wday #=> 2
t.sunday? #=> false
t.monday? #=> false
t.tuesday? #=> true
t.wednesday? #=> false
t.thursday? #=> false
t.friday? #=> false
t.saturday? #=> false
Source: show
static VALUE time_wday(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.wday); }
Returns true
if time represents Wednesday.
t = Time.local(1993, 2, 24) #=> 1993-02-24 00:00:00 -0600
p t.wednesday? #=> true
Source: show
static VALUE time_wednesday(VALUE time) { wday_p(3); }
Parses date
as dateTime defined by XML Schema and converts it
to a Time object. The format is restricted version
of the format defined by ISO 8601.
ArgumentError is raised if
date
is not compliant with the format or Time class cannot represent specified date.
See xmlschema for more information on this format.
time library should be required to use this method as follows.
require 'time'
# File ../ruby/lib/time.rb, line 420 def xmlschema(date) if /\A\s* (-?\d+)-(\d\d)-(\d\d) T (\d\d):(\d\d):(\d\d) (\.\d+)? (Z|[+-]\d\d:\d\d)? \s*\z/ix =~ date year = $1.to_i mon = $2.to_i day = $3.to_i hour = $4.to_i min = $5.to_i sec = $6.to_i usec = 0 if $7 usec = Rational($7) * 1000000 end if $8 zone = $8 year, mon, day, hour, min, sec = apply_offset(year, mon, day, hour, min, sec, zone_offset(zone)) self.utc(year, mon, day, hour, min, sec, usec) else self.local(year, mon, day, hour, min, sec, usec) end else raise ArgumentError.new("invalid date: #{date.inspect}") end end
Returns an integer representing the day of the year, 1..366.
t = Time.now #=> 2007-11-19 08:32:31 -0600
t.yday #=> 323
Source: show
static VALUE time_yday(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.yday); }
Returns the year for time (including the century).
t = Time.now #=> 2007-11-19 08:27:51 -0600
t.year #=> 2007
Source: show
static VALUE time_year(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return tobj->vtm.year; }
Returns the name of the time zone used for time. As of Ruby 1.8, returns “UTC'' rather than “GMT'' for UTC times.
t = Time.gm(2000, "jan", 1, 20, 15, 1)
t.zone #=> "UTC"
t = Time.local(2000, "jan", 1, 20, 15, 1)
t.zone #=> "CST"
Source: show
static VALUE time_zone(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); if (TIME_UTC_P(tobj)) { return rb_obj_untaint(rb_locale_str_new_cstr("UTC")); } if (tobj->vtm.zone == NULL) return Qnil; return rb_obj_untaint(rb_locale_str_new_cstr(tobj->vtm.zone)); }
# File ../ruby/lib/time.rb, line 69 def zone_offset(zone, year=self.now.year) off = nil zone = zone.upcase if /\A([+-])(\d\d):?(\d\d)\z/ =~ zone off = ($1 == '-' ? -1 : 1) * ($2.to_i * 60 + $3.to_i) * 60 elsif /\A[+-]\d\d\z/ =~ zone off = zone.to_i * 3600 elsif ZoneOffset.include?(zone) off = ZoneOffset[zone] * 3600 elsif ((t = self.local(year, 1, 1)).zone.upcase == zone rescue false) off = t.utc_offset elsif ((t = self.local(year, 7, 1)).zone.upcase == zone rescue false) off = t.utc_offset end off end
# File ../ruby/lib/time.rb, line 126 def apply_offset(year, mon, day, hour, min, sec, off) if off < 0 off = -off off, o = off.divmod(60) if o != 0 then sec += o; o, sec = sec.divmod(60); off += o end off, o = off.divmod(60) if o != 0 then min += o; o, min = min.divmod(60); off += o end off, o = off.divmod(24) if o != 0 then hour += o; o, hour = hour.divmod(24); off += o end if off != 0 day += off if month_days(year, mon) < day mon += 1 if 12 < mon mon = 1 year += 1 end day = 1 end end elsif 0 < off off, o = off.divmod(60) if o != 0 then sec -= o; o, sec = sec.divmod(60); off -= o end off, o = off.divmod(60) if o != 0 then min -= o; o, min = min.divmod(60); off -= o end off, o = off.divmod(24) if o != 0 then hour -= o; o, hour = hour.divmod(24); off -= o end if off != 0 then day -= off if day < 1 mon -= 1 if mon < 1 year -= 1 mon = 12 end day = month_days(year, mon) end end end return year, mon, day, hour, min, sec end
# File ../ruby/lib/time.rb, line 169 def make_time(year, mon, day, hour, min, sec, sec_fraction, zone, now) usec = nil usec = sec_fraction * 1000000 if sec_fraction if now begin break if year; year = now.year break if mon; mon = now.mon break if day; day = now.day break if hour; hour = now.hour break if min; min = now.min break if sec; sec = now.sec break if sec_fraction; usec = now.tv_usec end until true end year ||= 1970 mon ||= 1 day ||= 1 hour ||= 0 min ||= 0 sec ||= 0 usec ||= 0 off = nil off = zone_offset(zone, year) if zone if off year, mon, day, hour, min, sec = apply_offset(year, mon, day, hour, min, sec, off) t = self.utc(year, mon, day, hour, min, sec, usec) t.localtime if !zone_utc?(zone) t else self.local(year, mon, day, hour, min, sec, usec) end end
# File ../ruby/lib/time.rb, line 86 def zone_utc?(zone) # * +0000 # In RFC 2822, +0000 indicate a time zone at Universal Time. # Europe/London is "a time zone at Universal Time" in Winter. # Europe/Lisbon is "a time zone at Universal Time" in Winter. # Atlantic/Reykjavik is "a time zone at Universal Time". # Africa/Dakar is "a time zone at Universal Time". # So +0000 is a local time such as Europe/London, etc. # * GMT # GMT is used as a time zone abbreviation in Europe/London, # Africa/Dakar, etc. # So it is a local time. # # * -0000, -00:00 # In RFC 2822, -0000 the date-time contains no information about the # local time zone. # In RFC 3339, -00:00 is used for the time in UTC is known, # but the offset to local time is unknown. # They are not appropriate for specific time zone such as # Europe/London because time zone neutral, # So -00:00 and -0000 are treated as UTC. if /\A(?:-00:00|-0000|-00|UTC|Z|UT)\z/i =~ zone true else false end end