Class: Time
Class Method Summary collapse
-
.local(*args) ⇒ Object
Like Time.utc, except that the returned
Time
object has the local timezone, not the UTC timezone:. -
.utc(*args) ⇒ Object
Returns a new
Time
object based the on given arguments, in the UTC timezone.
Instance Method Summary collapse
-
#+(numeric) ⇒ Time
Returns a new
Time
object whose value is the sum of the numeric value ofself
and the givennumeric
:. -
#-(time2) ⇒ Object
When
numeric
is given, returns a newTime
object whose value is the difference of the numeric value ofself
andnumeric
:. -
#<=>(other_time) ⇒ -1, ...
Compares
self
withother_time
; returns:. -
#_dump(*args) ⇒ Object
private
:nodoc:.
-
#_load(str) ⇒ Object
private
:nodoc:.
-
#ctime ⇒ String
Returns a string representation of
self
, formatted bystrftime('%a %b %e %T %Y')
or its shorthand versionstrftime('%c')
; see Formats for Dates and Times:. -
#ceil(ndigits = 0) ⇒ Time
Returns a new
Time
object whose numerical value is greater than or equal toself
with its seconds truncated to precisionndigits
:. -
#ctime ⇒ String
Returns a string representation of
self
, formatted bystrftime('%a %b %e %T %Y')
or its shorthand versionstrftime('%c')
; see Formats for Dates and Times:. -
#mday ⇒ Integer
Returns the integer day of the month for
self
, in range (1..31):. -
#deconstruct_keys(array_of_names_or_nil) ⇒ Hash
Returns a hash of the name/value pairs, to use in pattern matching.
-
#dst? ⇒ Boolean
Returns
true
ifself
is in daylight saving time,false
otherwise:. -
#eql?(other_time) ⇒ Boolean
Returns
true
ifself
andother_time
are bothTime
objects with the exact same time value. -
#floor(ndigits = 0) ⇒ Time
Returns a new
Time
object whose numerical value is less than or equal toself
with its seconds truncated to precisionndigits
:. -
#friday? ⇒ Boolean
Returns
true
ifself
represents a Friday,false
otherwise:. -
#getutc ⇒ Time
Returns a new
Time
object representing the value ofself
converted to the UTC timezone:. -
#getlocal(zone = nil) ⇒ Time
Returns a new
Time
object representing the value ofself
converted to a given timezone; ifzone
isnil
, the local timezone is used:. -
#getutc ⇒ Time
Returns a new
Time
object representing the value ofself
converted to the UTC timezone:. -
#utc? ⇒ Boolean
Returns
true
ifself
represents a time in UTC (GMT):. -
#utc_offset ⇒ Integer
Returns the offset in seconds between the timezones of UTC and
self
:. -
#utc ⇒ self
Returns
self
, converted to the UTC timezone:. -
#utc_offset ⇒ Integer
Returns the offset in seconds between the timezones of UTC and
self
:. -
#hash ⇒ Integer
Returns the integer hash code for
self
. -
#hour ⇒ Integer
Returns the integer hour of the day for
self
, in range (0..23):. -
#initialize_copy(time) ⇒ Object
:nodoc:.
-
#inspect ⇒ String
Returns a string representation of
self
with subseconds:. -
#dst? ⇒ Boolean
Returns
true
ifself
is in daylight saving time,false
otherwise:. -
#localtime(*args) ⇒ Object
With no argument given:.
-
#mday ⇒ Integer
Returns the integer day of the month for
self
, in range (1..31):. -
#min ⇒ Integer
Returns the integer minute of the hour for
self
, in range (0..59):. -
#mon ⇒ Integer
Returns the integer month of the year for
self
, in range (1..12):. -
#monday? ⇒ Boolean
Returns
true
ifself
represents a Monday,false
otherwise:. -
#mon ⇒ Integer
Returns the integer month of the year for
self
, in range (1..12):. -
#nsec ⇒ Integer
Returns the number of nanoseconds in the subseconds part of
self
in the range (0..999_999_999); lower-order digits are truncated, not rounded:. -
#round(ndigits = 0) ⇒ Time
Returns a new
Time
object whose numeric value is that ofself
, with its seconds value rounded to precisionndigits
:. -
#saturday? ⇒ Boolean
Returns
true
ifself
represents a Saturday,false
otherwise:. -
#sec ⇒ Integer
Returns the integer second of the minute for
self
, in range (0..60):. -
#strftime(format_string) ⇒ String
Returns a string representation of
self
, formatted according to the given stringformat
. -
#subsec ⇒ Numeric
Returns the exact subseconds for
self
as a Numeric (Integer or Rational):. -
#sunday? ⇒ Boolean
Returns
true
ifself
represents a Sunday,false
otherwise:. -
#thursday? ⇒ Boolean
Returns
true
ifself
represents a Thursday,false
otherwise:. -
#to_a ⇒ Array
Returns a 10-element array of values representing
self
:. -
#to_f ⇒ Float
Returns the value of
self
as a Float number Epoch seconds; subseconds are included. -
#to_i ⇒ Integer
Returns the value of
self
as integer Epoch seconds; subseconds are truncated (not rounded):. -
#to_r ⇒ Object
Returns the value of
self
as a Rational exact number of Epoch seconds;. -
#to_s ⇒ String
Returns a string representation of
self
, without subseconds:. -
#tuesday? ⇒ Boolean
Returns
true
ifself
represents a Tuesday,false
otherwise:. -
#nsec ⇒ Integer
Returns the number of nanoseconds in the subseconds part of
self
in the range (0..999_999_999); lower-order digits are truncated, not rounded:. -
#to_i ⇒ Integer
Returns the value of
self
as integer Epoch seconds; subseconds are truncated (not rounded):. -
#usec ⇒ Integer
Returns the number of microseconds in the subseconds part of
self
in the range (0..999_999); lower-order digits are truncated, not rounded:. -
#usec ⇒ Integer
Returns the number of microseconds in the subseconds part of
self
in the range (0..999_999); lower-order digits are truncated, not rounded:. -
#utc ⇒ self
(also: #gm)
Returns
self
, converted to the UTC timezone:. -
#utc? ⇒ Boolean
Returns
true
ifself
represents a time in UTC (GMT):. -
#utc_offset ⇒ Integer
Returns the offset in seconds between the timezones of UTC and
self
:. -
#wday ⇒ Integer
Returns the integer day of the week for
self
, in range (0..6), with Sunday as zero. -
#wednesday? ⇒ Boolean
Returns
true
ifself
represents a Wednesday,false
otherwise:. -
#xmlschema(fraction_digits = 0) ⇒ String
(also: #iso8601)
Returns a string which represents the time as a dateTime defined by XML Schema:.
-
#yday ⇒ Integer
Returns the integer day of the year of
self
, in range (1..366). -
#year ⇒ Integer
Returns the integer year for
self
:. -
#zone ⇒ String
Returns the string name of the time zone for
self
:.
Methods included from Comparable
#<, #<=, #==, #>, #>=, #between?, #clamp
Class Method Details
.local(year, month = 1, mday = 1, hour = 0, min = 0, sec = 0, usec = 0) ⇒ Time .local(sec, min, hour, mday, month, year, dummy, dummy, dummy, dummy) ⇒ Time
3768 3769 3770 3771 3772 3773 3774 3775 |
# File 'time.c', line 3768
static VALUE
time_s_mktime(int argc, VALUE *argv, VALUE klass)
{
struct vtm vtm;
time_arg(argc, argv, &vtm);
return time_localtime(time_new_timew(klass, timelocalw(&vtm)));
}
|
.utc(year, month = 1, mday = 1, hour = 0, min = 0, sec = 0, usec = 0) ⇒ Time .utc(sec, min, hour, mday, month, year, dummy, dummy, dummy, dummy) ⇒ Time
Returns a new Time
object based the on given arguments, in the UTC timezone.
With one to seven arguments given, the arguments are interpreted as in the first calling sequence above:
Time.utc(year, month = 1, mday = 1, hour = 0, min = 0, sec = 0, usec = 0)
Examples:
Time.utc(2000) # => 2000-01-01 00:00:00 UTC
Time.utc(-2000) # => -2000-01-01 00:00:00 UTC
There are no minimum and maximum values for the required argument year
.
For the optional arguments:
-
month
: Month in range (1..12), or case-insensitive 3-letter month name:Time.utc(2000, 1) # => 2000-01-01 00:00:00 UTC Time.utc(2000, 12) # => 2000-12-01 00:00:00 UTC Time.utc(2000, 'jan') # => 2000-01-01 00:00:00 UTC Time.utc(2000, 'JAN') # => 2000-01-01 00:00:00 UTC
-
mday
: Month day in range(1..31):Time.utc(2000, 1, 1) # => 2000-01-01 00:00:00 UTC Time.utc(2000, 1, 31) # => 2000-01-31 00:00:00 UTC
-
hour
: Hour in range (0..23), or 24 ifmin
,sec
, andusec
are zero:Time.utc(2000, 1, 1, 0) # => 2000-01-01 00:00:00 UTC Time.utc(2000, 1, 1, 23) # => 2000-01-01 23:00:00 UTC Time.utc(2000, 1, 1, 24) # => 2000-01-02 00:00:00 UTC
-
min
: Minute in range (0..59):Time.utc(2000, 1, 1, 0, 0) # => 2000-01-01 00:00:00 UTC Time.utc(2000, 1, 1, 0, 59) # => 2000-01-01 00:59:00 UTC
-
sec
: Second in range (0..59), or 60 ifusec
is zero:Time.utc(2000, 1, 1, 0, 0, 0) # => 2000-01-01 00:00:00 UTC Time.utc(2000, 1, 1, 0, 0, 59) # => 2000-01-01 00:00:59 UTC Time.utc(2000, 1, 1, 0, 0, 60) # => 2000-01-01 00:01:00 UTC
-
usec
: Microsecond in range (0..999999):Time.utc(2000, 1, 1, 0, 0, 0, 0) # => 2000-01-01 00:00:00 UTC Time.utc(2000, 1, 1, 0, 0, 0, 999999) # => 2000-01-01 00:00:00.999999 UTC
The values may be:
-
Integers, as above.
-
Numerics convertible to integers:
Time.utc(Float(0.0), Rational(1, 1), 1.0, 0.0, 0.0, 0.0, 0.0) # => 0000-01-01 00:00:00 UTC
-
String integers:
a = %w[0 1 1 0 0 0 0 0] # => ["0", "1", "1", "0", "0", "0", "0", "0"] Time.utc(*a) # => 0000-01-01 00:00:00 UTC
When exactly ten arguments are given, the arguments are interpreted as in the second calling sequence above:
Time.utc(sec, min, hour, mday, month, year, dummy, dummy, dummy, dummy)
where the dummy
arguments are ignored:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Time.utc(*a) # => 0005-04-03 02:01:00 UTC
This form is useful for creating a Time
object from a 10-element array returned by Time.to_a:
t = Time.new(2000, 1, 2, 3, 4, 5, 6) # => 2000-01-02 03:04:05 +000006
a = t.to_a # => [5, 4, 3, 2, 1, 2000, 0, 2, false, nil]
Time.utc(*a) # => 2000-01-02 03:04:05 UTC
The two forms have their first six arguments in common, though in different orders; the ranges of these common arguments are the same for both forms; see above.
Raises an exception if the number of arguments is eight, nine, or greater than ten.
Related: Time.local.
3742 3743 3744 3745 3746 3747 3748 3749 |
# File 'time.c', line 3742
static VALUE
time_s_mkutc(int argc, VALUE *argv, VALUE klass)
{
struct vtm vtm;
time_arg(argc, argv, &vtm);
return time_gmtime(time_new_timew(klass, timegmw(&vtm)));
}
|
Instance Method Details
#+(numeric) ⇒ Time
4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 |
# File 'time.c', line 4465
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, time1, time2, 1);
}
|
#-(numeric) ⇒ Time #-(other_time) ⇒ Float
When numeric
is given, returns a new Time
object whose value is the difference of the numeric value of self
and numeric
:
t = Time.new(2000) # => 2000-01-01 00:00:00 -0600
t - (60 * 60 * 24) # => 1999-12-31 00:00:00 -0600
t - 0.5 # => 1999-12-31 23:59:59.5 -0600
When other_time
is given, returns a Float whose value is the difference of the numeric values of self
and other_time
in seconds:
t - t # => 0.0
Related: Time#+.
4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 |
# File 'time.c', line 4499
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, time1, time2, -1);
}
|
#<=>(other_time) ⇒ -1, ...
Compares self
with other_time
; returns:
-
-1
, ifself
is less thanother_time
. -
0
, ifself
is equal toother_time
. -
1
, ifself
is greater thenother_time
. -
nil
, ifself
andother_time
are incomparable.
Examples:
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
3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 |
# File 'time.c', line 3961
static VALUE
time_cmp(VALUE time1, VALUE time2)
{
struct time_object *tobj1, *tobj2;
int n;
GetTimeval(time1, tobj1);
if (IsTimeval(time2)) {
GetTimeval(time2, tobj2);
n = wcmp(tobj1->timew, tobj2->timew);
}
else {
return rb_invcmp(time1, time2);
}
if (n == 0) return INT2FIX(0);
if (n > 0) return INT2FIX(1);
return INT2FIX(-1);
}
|
#_dump(*args) ⇒ Object (private)
:nodoc:
5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 |
# File 'time.c', line 5554
static VALUE
time_dump(int argc, VALUE *argv, VALUE time)
{
VALUE str;
rb_check_arity(argc, 0, 1);
str = time_mdump(time);
return str;
}
|
#_load(str) ⇒ Object (private)
:nodoc:
5740 5741 5742 5743 5744 5745 5746 5747 |
# File 'time.c', line 5740
static VALUE
time_load(VALUE klass, VALUE str)
{
VALUE time = time_s_alloc(klass);
time_mload(time, str);
return time;
}
|
#ctime ⇒ String
Returns a string representation of self
, formatted by strftime('%a %b %e %T %Y')
or its shorthand version strftime('%c')
; see Formats for Dates and Times:
t = Time.new(2000, 12, 31, 23, 59, 59, 0.5)
t.ctime # => "Sun Dec 31 23:59:59 2000"
t.strftime('%a %b %e %T %Y') # => "Sun Dec 31 23:59:59 2000"
t.strftime('%c') # => "Sun Dec 31 23:59:59 2000"
Related: Time#to_s, Time#inspect:
t.inspect # => "2000-12-31 23:59:59.5 +000001"
t.to_s # => "2000-12-31 23:59:59 +0000"
4339 4340 4341 4342 4343 |
# File 'time.c', line 4339
static VALUE
time_asctime(VALUE time)
{
return strftimev("%a %b %e %T %Y", time, rb_usascii_encoding());
}
|
#ceil(ndigits = 0) ⇒ Time
Returns a new Time
object whose numerical value is greater than or equal to self
with its seconds truncated to precision ndigits
:
t = Time.utc(2010, 3, 30, 5, 43, 25.123456789r)
t # => 2010-03-30 05:43:25.123456789 UTC
t.ceil # => 2010-03-30 05:43:26 UTC
t.ceil(2) # => 2010-03-30 05:43:25.13 UTC
t.ceil(4) # => 2010-03-30 05:43:25.1235 UTC
t.ceil(6) # => 2010-03-30 05:43:25.123457 UTC
t.ceil(8) # => 2010-03-30 05:43:25.12345679 UTC
t.ceil(10) # => 2010-03-30 05:43:25.123456789 UTC
t = Time.utc(1999, 12, 31, 23, 59, 59)
t # => 1999-12-31 23:59:59 UTC
(t + 0.4).ceil # => 2000-01-01 00:00:00 UTC
(t + 0.9).ceil # => 2000-01-01 00:00:00 UTC
(t + 1.4).ceil # => 2000-01-01 00:00:01 UTC
(t + 1.9).ceil # => 2000-01-01 00:00:01 UTC
Related: Time#floor, Time#round.
4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 |
# File 'time.c', line 4650
static VALUE
time_ceil(int argc, VALUE *argv, VALUE time)
{
VALUE ndigits, v, den;
struct time_object *tobj;
if (!rb_check_arity(argc, 0, 1) || NIL_P(ndigits = argv[0]))
den = INT2FIX(1);
else
den = ndigits_denominator(ndigits);
GetTimeval(time, tobj);
v = w2v(rb_time_unmagnify(tobj->timew));
v = modv(v, den);
if (!rb_equal(v, INT2FIX(0))) {
v = subv(den, v);
}
return time_add(tobj, time, v, 1);
}
|
#ctime ⇒ String
Returns a string representation of self
, formatted by strftime('%a %b %e %T %Y')
or its shorthand version strftime('%c')
; see Formats for Dates and Times:
t = Time.new(2000, 12, 31, 23, 59, 59, 0.5)
t.ctime # => "Sun Dec 31 23:59:59 2000"
t.strftime('%a %b %e %T %Y') # => "Sun Dec 31 23:59:59 2000"
t.strftime('%c') # => "Sun Dec 31 23:59:59 2000"
Related: Time#to_s, Time#inspect:
t.inspect # => "2000-12-31 23:59:59.5 +000001"
t.to_s # => "2000-12-31 23:59:59 +0000"
4339 4340 4341 4342 4343 |
# File 'time.c', line 4339
static VALUE
time_asctime(VALUE time)
{
return strftimev("%a %b %e %T %Y", time, rb_usascii_encoding());
}
|
#mday ⇒ Integer
4760 4761 4762 4763 4764 4765 4766 4767 4768 |
# File 'time.c', line 4760
static VALUE
time_mday(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.mday);
}
|
#deconstruct_keys(array_of_names_or_nil) ⇒ Hash
Returns a hash of the name/value pairs, to use in pattern matching. Possible keys are: :year
, :month
, :day
, :yday
, :wday
, :hour
, :min
, :sec
, :subsec
, :dst
, :zone
.
Possible usages:
t = Time.utc(2022, 10, 5, 21, 25, 30)
if t in wday: 3, day: ..7 # uses deconstruct_keys underneath
puts "first Wednesday of the month"
end
#=> prints "first Wednesday of the month"
case t
in year: ...2022
puts "too old"
in month: ..9
puts "quarter 1-3"
in wday: 1..5, month:
puts "working day in month #{month}"
end
#=> prints "working day in month 10"
Note that deconstruction by pattern can also be combined with class check:
if t in Time(wday: 3, day: ..7)
puts "first Wednesday of the month"
end
5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 |
# File 'time.c', line 5148
static VALUE
time_deconstruct_keys(VALUE time, VALUE keys)
{
struct time_object *tobj;
VALUE h;
long i;
GetTimeval(time, tobj);
MAKE_TM_ENSURE(time, tobj, tobj->vtm.yday != 0);
if (NIL_P(keys)) {
h = rb_hash_new_with_size(11);
rb_hash_aset(h, sym_year, tobj->vtm.year);
rb_hash_aset(h, sym_month, INT2FIX(tobj->vtm.mon));
rb_hash_aset(h, sym_day, INT2FIX(tobj->vtm.mday));
rb_hash_aset(h, sym_yday, INT2FIX(tobj->vtm.yday));
rb_hash_aset(h, sym_wday, INT2FIX(tobj->vtm.wday));
rb_hash_aset(h, sym_hour, INT2FIX(tobj->vtm.hour));
rb_hash_aset(h, sym_min, INT2FIX(tobj->vtm.min));
rb_hash_aset(h, sym_sec, INT2FIX(tobj->vtm.sec));
rb_hash_aset(h, sym_subsec,
quov(w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE))), INT2FIX(TIME_SCALE)));
rb_hash_aset(h, sym_dst, RBOOL(tobj->vtm.isdst));
rb_hash_aset(h, sym_zone, time_zone(time));
return h;
}
if (UNLIKELY(!RB_TYPE_P(keys, T_ARRAY))) {
rb_raise(rb_eTypeError,
"wrong argument type %"PRIsVALUE" (expected Array or nil)",
rb_obj_class(keys));
}
h = rb_hash_new_with_size(RARRAY_LEN(keys));
for (i=0; i<RARRAY_LEN(keys); i++) {
VALUE key = RARRAY_AREF(keys, i);
if (sym_year == key) rb_hash_aset(h, key, tobj->vtm.year);
if (sym_month == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.mon));
if (sym_day == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.mday));
if (sym_yday == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.yday));
if (sym_wday == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.wday));
if (sym_hour == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.hour));
if (sym_min == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.min));
if (sym_sec == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.sec));
if (sym_subsec == key) {
rb_hash_aset(h, key, quov(w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE))), INT2FIX(TIME_SCALE)));
}
if (sym_dst == key) rb_hash_aset(h, key, RBOOL(tobj->vtm.isdst));
if (sym_zone == key) rb_hash_aset(h, key, time_zone(time));
}
return h;
}
|
#dst? ⇒ Boolean
5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 |
# File 'time.c', line 5007
static VALUE
time_isdst(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
if (tobj->vtm.isdst == VTM_ISDST_INITVAL) {
rb_raise(rb_eRuntimeError, "isdst is not set yet");
}
return RBOOL(tobj->vtm.isdst);
}
|
#eql?(other_time) ⇒ Boolean
Returns true
if self
and other_time
are both Time
objects with the exact same time value.
3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 |
# File 'time.c', line 3988
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;
}
|
#floor(ndigits = 0) ⇒ Time
Returns a new Time
object whose numerical value is less than or equal to self
with its seconds truncated to precision ndigits
:
t = Time.utc(2010, 3, 30, 5, 43, 25.123456789r)
t # => 2010-03-30 05:43:25.123456789 UTC
t.floor # => 2010-03-30 05:43:25 UTC
t.floor(2) # => 2010-03-30 05:43:25.12 UTC
t.floor(4) # => 2010-03-30 05:43:25.1234 UTC
t.floor(6) # => 2010-03-30 05:43:25.123456 UTC
t.floor(8) # => 2010-03-30 05:43:25.12345678 UTC
t.floor(10) # => 2010-03-30 05:43:25.123456789 UTC
t = Time.utc(1999, 12, 31, 23, 59, 59)
t # => 1999-12-31 23:59:59 UTC
(t + 0.4).floor # => 1999-12-31 23:59:59 UTC
(t + 0.9).floor # => 1999-12-31 23:59:59 UTC
(t + 1.4).floor # => 2000-01-01 00:00:00 UTC
(t + 1.9).floor # => 2000-01-01 00:00:00 UTC
Related: Time#ceil, Time#round.
4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 |
# File 'time.c', line 4605
static VALUE
time_floor(int argc, VALUE *argv, VALUE time)
{
VALUE ndigits, v, den;
struct time_object *tobj;
if (!rb_check_arity(argc, 0, 1) || NIL_P(ndigits = argv[0]))
den = INT2FIX(1);
else
den = ndigits_denominator(ndigits);
GetTimeval(time, tobj);
v = w2v(rb_time_unmagnify(tobj->timew));
v = modv(v, den);
return time_add(tobj, time, v, -1);
}
|
#friday? ⇒ Boolean
4948 4949 4950 4951 4952 |
# File 'time.c', line 4948
static VALUE
time_friday(VALUE time)
{
wday_p(5);
}
|
#getutc ⇒ Time
4301 4302 4303 4304 4305 |
# File 'time.c', line 4301
static VALUE
time_getgmtime(VALUE time)
{
return time_gmtime(time_dup(time));
}
|
#getlocal(zone = nil) ⇒ Time
Returns a new Time
object representing the value of self
converted to a given timezone; if zone
is nil
, the local timezone is used:
t = Time.utc(2000) # => 2000-01-01 00:00:00 UTC
t.getlocal # => 1999-12-31 18:00:00 -0600
t.getlocal('+12:00') # => 2000-01-01 12:00:00 +1200
For forms of argument zone
, see Timezone Specifiers.
4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 |
# File 'time.c', line 4254
static VALUE
time_getlocaltime(int argc, VALUE *argv, VALUE time)
{
VALUE off;
if (rb_check_arity(argc, 0, 1) && !NIL_P(off = argv[0])) {
VALUE zone = off;
if (maybe_tzobj_p(zone)) {
VALUE t = time_dup(time);
if (zone_localtime(off, t)) return t;
}
if (NIL_P(off = utc_offset_arg(off))) {
off = zone;
if (NIL_P(zone = find_timezone(time, off))) invalid_utc_offset(off);
time = time_dup(time);
if (!zone_localtime(zone, time)) invalid_utc_offset(off);
return time;
}
else if (off == UTC_ZONE) {
return time_gmtime(time_dup(time));
}
validate_utc_offset(off);
time = time_dup(time);
time_set_utc_offset(time, off);
return time_fixoff(time);
}
return time_localtime(time_dup(time));
}
|
#getutc ⇒ Time
4301 4302 4303 4304 4305 |
# File 'time.c', line 4301
static VALUE
time_getgmtime(VALUE time)
{
return time_gmtime(time_dup(time));
}
|
#utc? ⇒ Boolean
Returns true
if self
represents a time in UTC (GMT):
now = Time.now
# => 2022-08-18 10:24:13.5398485 -0500
now.utc? # => false
now.getutc.utc? # => true
utc = Time.utc(2000, 1, 1, 20, 15, 1)
# => 2000-01-01 20:15:01 UTC
utc.utc? # => true
Time
objects created with these methods are considered to be in UTC:
-
Time.utc
-
Time#utc
-
Time#getutc
Objects created in other ways will not be treated as UTC even if the environment variable “TZ” is “UTC”.
Related: Time.utc.
4028 4029 4030 4031 4032 4033 4034 4035 |
# File 'time.c', line 4028
static VALUE
time_utc_p(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
return RBOOL(TZMODE_UTC_P(tobj));
}
|
#utc_offset ⇒ Integer
Returns the offset in seconds between the timezones of UTC and self
:
Time.utc(2000, 1, 1).utc_offset # => 0
Time.local(2000, 1, 1).utc_offset # => -21600 # -6*3600, or minus six hours.
5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 |
# File 'time.c', line 5062
VALUE
rb_time_utc_offset(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
if (TZMODE_UTC_P(tobj)) {
return INT2FIX(0);
}
else {
MAKE_TM(time, tobj);
return tobj->vtm.utc_offset;
}
}
|
#utc ⇒ self
4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 |
# File 'time.c', line 4179
static VALUE
time_gmtime(VALUE time)
{
struct time_object *tobj;
struct vtm vtm;
GetTimeval(time, tobj);
if (TZMODE_UTC_P(tobj)) {
if (tobj->vtm.tm_got)
return time;
}
else {
time_modify(time);
}
vtm.zone = str_utc;
GMTIMEW(tobj->timew, &vtm);
time_set_vtm(time, tobj, vtm);
tobj->vtm.tm_got = 1;
TZMODE_SET_UTC(tobj);
return time;
}
|
#utc_offset ⇒ Integer
Returns the offset in seconds between the timezones of UTC and self
:
Time.utc(2000, 1, 1).utc_offset # => 0
Time.local(2000, 1, 1).utc_offset # => -21600 # -6*3600, or minus six hours.
5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 |
# File 'time.c', line 5062
VALUE
rb_time_utc_offset(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
if (TZMODE_UTC_P(tobj)) {
return INT2FIX(0);
}
else {
MAKE_TM(time, tobj);
return tobj->vtm.utc_offset;
}
}
|
#hash ⇒ Integer
Returns the integer hash code for self
.
Related: Object#hash.
4046 4047 4048 4049 4050 4051 4052 4053 |
# File 'time.c', line 4046
static VALUE
time_hash(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
return rb_hash(w2v(tobj->timew));
}
|
#hour ⇒ Integer
4736 4737 4738 4739 4740 4741 4742 4743 4744 |
# File 'time.c', line 4736
static VALUE
time_hour(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.hour);
}
|
#initialize_copy(time) ⇒ Object
:nodoc:
4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 |
# File 'time.c', line 4056
static VALUE
time_init_copy(VALUE copy, VALUE time)
{
struct time_object *tobj, *tcopy;
if (!OBJ_INIT_COPY(copy, time)) return copy;
GetTimeval(time, tobj);
GetNewTimeval(copy, tcopy);
MEMCPY(tcopy, tobj, struct time_object, 1);
return copy;
}
|
#inspect ⇒ String
4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 |
# File 'time.c', line 4389
static VALUE
time_inspect(VALUE time)
{
struct time_object *tobj;
VALUE str, subsec;
GetTimeval(time, tobj);
str = strftimev("%Y-%m-%d %H:%M:%S", time, rb_usascii_encoding());
subsec = w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE)));
if (subsec == INT2FIX(0)) {
}
else if (FIXNUM_P(subsec) && FIX2LONG(subsec) < TIME_SCALE) {
long len;
rb_str_catf(str, ".%09ld", FIX2LONG(subsec));
for (len=RSTRING_LEN(str); RSTRING_PTR(str)[len-1] == '0' && len > 0; len--)
;
rb_str_resize(str, len);
}
else {
rb_str_cat_cstr(str, " ");
subsec = quov(subsec, INT2FIX(TIME_SCALE));
rb_str_concat(str, rb_obj_as_string(subsec));
}
if (TZMODE_UTC_P(tobj)) {
rb_str_cat_cstr(str, " UTC");
}
else {
/* ?TODO: subsecond offset */
long off = NUM2LONG(rb_funcall(tobj->vtm.utc_offset, rb_intern("round"), 0));
char sign = (off < 0) ? (off = -off, '-') : '+';
int sec = off % 60;
int min = (off /= 60) % 60;
off /= 60;
rb_str_catf(str, " %c%.2d%.2d", sign, (int)off, min);
if (sec) rb_str_catf(str, "%.2d", sec);
}
return str;
}
|
#dst? ⇒ Boolean
5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 |
# File 'time.c', line 5007
static VALUE
time_isdst(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
if (tobj->vtm.isdst == VTM_ISDST_INITVAL) {
rb_raise(rb_eRuntimeError, "isdst is not set yet");
}
return RBOOL(tobj->vtm.isdst);
}
|
#localtime ⇒ self, Time #localtime(zone) ⇒ Time
With no argument given:
-
Returns
self
ifself
is a local time. -
Otherwise returns a new
Time
in the user’s local timezone:t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC t.localtime # => 2000-01-01 14:15:01 -0600
With argument zone
given, returns the new Time
object created by converting self
to the given time zone:
t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
t.localtime("-09:00") # => 2000-01-01 11:15:01 -0900
For forms of argument zone
, see Timezone Specifiers.
4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 |
# File 'time.c', line 4153
static VALUE
time_localtime_m(int argc, VALUE *argv, VALUE time)
{
VALUE off;
if (rb_check_arity(argc, 0, 1) && !NIL_P(off = argv[0])) {
return time_zonelocal(time, off);
}
return time_localtime(time);
}
|
#mday ⇒ Integer
4760 4761 4762 4763 4764 4765 4766 4767 4768 |
# File 'time.c', line 4760
static VALUE
time_mday(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.mday);
}
|
#min ⇒ Integer
4712 4713 4714 4715 4716 4717 4718 4719 4720 |
# File 'time.c', line 4712
static VALUE
time_min(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.min);
}
|
#mon ⇒ Integer
4784 4785 4786 4787 4788 4789 4790 4791 4792 |
# File 'time.c', line 4784
static VALUE
time_mon(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.mon);
}
|
#monday? ⇒ Boolean
4876 4877 4878 4879 4880 |
# File 'time.c', line 4876
static VALUE
time_monday(VALUE time)
{
wday_p(1);
}
|
#mon ⇒ Integer
4784 4785 4786 4787 4788 4789 4790 4791 4792 |
# File 'time.c', line 4784
static VALUE
time_mon(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.mon);
}
|
#nsec ⇒ Integer
Returns the number of nanoseconds in the subseconds part of self
in the range (0..999_999_999); lower-order digits are truncated, not rounded:
t = Time.now # => 2022-07-11 15:04:53.3219637 -0500
t.nsec # => 321963700
Related: Time#subsec (returns exact subseconds).
3898 3899 3900 3901 3902 3903 3904 3905 |
# File 'time.c', line 3898
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)));
}
|
#round(ndigits = 0) ⇒ Time
Returns a new Time
object whose numeric value is that of self
, with its seconds value rounded to precision ndigits
:
t = Time.utc(2010, 3, 30, 5, 43, 25.123456789r)
t # => 2010-03-30 05:43:25.123456789 UTC
t.round # => 2010-03-30 05:43:25 UTC
t.round(0) # => 2010-03-30 05:43:25 UTC
t.round(1) # => 2010-03-30 05:43:25.1 UTC
t.round(2) # => 2010-03-30 05:43:25.12 UTC
t.round(3) # => 2010-03-30 05:43:25.123 UTC
t.round(4) # => 2010-03-30 05:43:25.1235 UTC
t = Time.utc(1999, 12,31, 23, 59, 59)
t # => 1999-12-31 23:59:59 UTC
(t + 0.4).round # => 1999-12-31 23:59:59 UTC
(t + 0.49).round # => 1999-12-31 23:59:59 UTC
(t + 0.5).round # => 2000-01-01 00:00:00 UTC
(t + 1.4).round # => 2000-01-01 00:00:00 UTC
(t + 1.49).round # => 2000-01-01 00:00:00 UTC
(t + 1.5).round # => 2000-01-01 00:00:01 UTC
Related: Time#ceil, Time#floor.
4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 |
# File 'time.c', line 4557
static VALUE
time_round(int argc, VALUE *argv, VALUE time)
{
VALUE ndigits, v, den;
struct time_object *tobj;
if (!rb_check_arity(argc, 0, 1) || NIL_P(ndigits = argv[0]))
den = INT2FIX(1);
else
den = ndigits_denominator(ndigits);
GetTimeval(time, tobj);
v = w2v(rb_time_unmagnify(tobj->timew));
v = modv(v, den);
if (lt(v, quov(den, INT2FIX(2))))
return time_add(tobj, time, v, -1);
else
return time_add(tobj, time, subv(den, v), 1);
}
|
#saturday? ⇒ Boolean
4966 4967 4968 4969 4970 |
# File 'time.c', line 4966
static VALUE
time_saturday(VALUE time)
{
wday_p(6);
}
|
#sec ⇒ Integer
Returns the integer second of the minute for self
, in range (0..60):
t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.sec # => 5
Note: the second value may be 60 when there is a leap second.
Related: Time#year, Time#mon, Time#min.
4688 4689 4690 4691 4692 4693 4694 4695 4696 |
# File 'time.c', line 4688
static VALUE
time_sec(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.sec);
}
|
#strftime(format_string) ⇒ String
Returns a string representation of self
, formatted according to the given string format
. See Formats for Dates and Times.
5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 |
# File 'time.c', line 5245
static VALUE
time_strftime(VALUE time, VALUE format)
{
struct time_object *tobj;
const char *fmt;
long len;
rb_encoding *enc;
VALUE tmp;
GetTimeval(time, tobj);
MAKE_TM_ENSURE(time, tobj, tobj->vtm.yday != 0);
StringValue(format);
if (!rb_enc_str_asciicompat_p(format)) {
rb_raise(rb_eArgError, "format should have ASCII compatible encoding");
}
tmp = rb_str_tmp_frozen_acquire(format);
fmt = RSTRING_PTR(tmp);
len = RSTRING_LEN(tmp);
enc = rb_enc_get(format);
if (len == 0) {
rb_warning("strftime called with empty format string");
return rb_enc_str_new(0, 0, enc);
}
else {
VALUE str = rb_strftime_alloc(fmt, len, enc, time, &tobj->vtm, tobj->timew,
TZMODE_UTC_P(tobj));
rb_str_tmp_frozen_release(format, tmp);
if (!str) rb_raise(rb_eArgError, "invalid format: %"PRIsVALUE, format);
return str;
}
}
|
#subsec ⇒ Numeric
3924 3925 3926 3927 3928 3929 3930 3931 |
# File 'time.c', line 3924
static VALUE
time_subsec(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
return quov(w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE))), INT2FIX(TIME_SCALE));
}
|
#sunday? ⇒ Boolean
4858 4859 4860 4861 4862 |
# File 'time.c', line 4858
static VALUE
time_sunday(VALUE time)
{
wday_p(0);
}
|
#thursday? ⇒ Boolean
4930 4931 4932 4933 4934 |
# File 'time.c', line 4930
static VALUE
time_thursday(VALUE time)
{
wday_p(4);
}
|
#to_a ⇒ Array
5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 |
# File 'time.c', line 5093
static VALUE
time_to_a(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM_ENSURE(time, tobj, tobj->vtm.yday != 0);
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),
RBOOL(tobj->vtm.isdst),
time_zone(time));
}
|
#to_f ⇒ Float
Returns the value of self
as a Float number Epoch seconds; subseconds are included.
The stored value of self
is a Rational, which means that the returned value may be approximate:
Time.utc(1970, 1, 1, 0, 0, 0).to_f # => 0.0
Time.utc(1970, 1, 1, 0, 0, 0, 999999).to_f # => 0.999999
Time.utc(1950, 1, 1, 0, 0, 0).to_f # => -631152000.0
Time.utc(1990, 1, 1, 0, 0, 0).to_f # => 631152000.0
Related: Time#to_i, Time#to_r.
3822 3823 3824 3825 3826 3827 3828 3829 |
# File 'time.c', line 3822
static VALUE
time_to_f(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
return rb_Float(rb_time_unmagnify_to_float(tobj->timew));
}
|
#to_i ⇒ Integer
Returns the value of self
as integer Epoch seconds; subseconds are truncated (not rounded):
Time.utc(1970, 1, 1, 0, 0, 0).to_i # => 0
Time.utc(1970, 1, 1, 0, 0, 0, 999999).to_i # => 0
Time.utc(1950, 1, 1, 0, 0, 0).to_i # => -631152000
Time.utc(1990, 1, 1, 0, 0, 0).to_i # => 631152000
Related: Time#to_f Time#to_r.
3793 3794 3795 3796 3797 3798 3799 3800 |
# File 'time.c', line 3793
static VALUE
time_to_i(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE)));
}
|
#to_r ⇒ Object
Returns the value of self
as a Rational exact number of Epoch seconds;
Time.now.to_r # => (16571402750320203/10000000)
Related: Time#to_f, Time#to_i.
3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 |
# File 'time.c', line 3843
static VALUE
time_to_r(VALUE time)
{
struct time_object *tobj;
VALUE v;
GetTimeval(time, tobj);
v = rb_time_unmagnify_to_rational(tobj->timew);
if (!RB_TYPE_P(v, T_RATIONAL)) {
v = rb_Rational1(v);
}
return v;
}
|
#to_s ⇒ String
4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 |
# File 'time.c', line 4361
static VALUE
time_to_s(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
if (TZMODE_UTC_P(tobj))
return strftimev("%Y-%m-%d %H:%M:%S UTC", time, rb_usascii_encoding());
else
return strftimev("%Y-%m-%d %H:%M:%S %z", time, rb_usascii_encoding());
}
|
#tuesday? ⇒ Boolean
4894 4895 4896 4897 4898 |
# File 'time.c', line 4894
static VALUE
time_tuesday(VALUE time)
{
wday_p(2);
}
|
#nsec ⇒ Integer
Returns the number of nanoseconds in the subseconds part of self
in the range (0..999_999_999); lower-order digits are truncated, not rounded:
t = Time.now # => 2022-07-11 15:04:53.3219637 -0500
t.nsec # => 321963700
Related: Time#subsec (returns exact subseconds).
3898 3899 3900 3901 3902 3903 3904 3905 |
# File 'time.c', line 3898
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)));
}
|
#to_i ⇒ Integer
Returns the value of self
as integer Epoch seconds; subseconds are truncated (not rounded):
Time.utc(1970, 1, 1, 0, 0, 0).to_i # => 0
Time.utc(1970, 1, 1, 0, 0, 0, 999999).to_i # => 0
Time.utc(1950, 1, 1, 0, 0, 0).to_i # => -631152000
Time.utc(1990, 1, 1, 0, 0, 0).to_i # => 631152000
Related: Time#to_f Time#to_r.
3793 3794 3795 3796 3797 3798 3799 3800 |
# File 'time.c', line 3793
static VALUE
time_to_i(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE)));
}
|
#usec ⇒ Integer
Returns the number of microseconds in the subseconds part of self
in the range (0..999_999); lower-order digits are truncated, not rounded:
t = Time.now # => 2022-07-11 14:59:47.5484697 -0500
t.usec # => 548469
Related: Time#subsec (returns exact subseconds).
3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 |
# File 'time.c', line 3871
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));
}
|
#usec ⇒ Integer
Returns the number of microseconds in the subseconds part of self
in the range (0..999_999); lower-order digits are truncated, not rounded:
t = Time.now # => 2022-07-11 14:59:47.5484697 -0500
t.usec # => 548469
Related: Time#subsec (returns exact subseconds).
3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 |
# File 'time.c', line 3871
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));
}
|
#utc ⇒ self Also known as: gm
4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 |
# File 'time.c', line 4179
static VALUE
time_gmtime(VALUE time)
{
struct time_object *tobj;
struct vtm vtm;
GetTimeval(time, tobj);
if (TZMODE_UTC_P(tobj)) {
if (tobj->vtm.tm_got)
return time;
}
else {
time_modify(time);
}
vtm.zone = str_utc;
GMTIMEW(tobj->timew, &vtm);
time_set_vtm(time, tobj, vtm);
tobj->vtm.tm_got = 1;
TZMODE_SET_UTC(tobj);
return time;
}
|
#utc? ⇒ Boolean
Returns true
if self
represents a time in UTC (GMT):
now = Time.now
# => 2022-08-18 10:24:13.5398485 -0500
now.utc? # => false
now.getutc.utc? # => true
utc = Time.utc(2000, 1, 1, 20, 15, 1)
# => 2000-01-01 20:15:01 UTC
utc.utc? # => true
Time
objects created with these methods are considered to be in UTC:
-
Time.utc
-
Time#utc
-
Time#getutc
Objects created in other ways will not be treated as UTC even if the environment variable “TZ” is “UTC”.
Related: Time.utc.
4028 4029 4030 4031 4032 4033 4034 4035 |
# File 'time.c', line 4028
static VALUE
time_utc_p(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
return RBOOL(TZMODE_UTC_P(tobj));
}
|
#utc_offset ⇒ Integer
5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 |
# File 'time.c', line 5062
VALUE
rb_time_utc_offset(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
if (TZMODE_UTC_P(tobj)) {
return INT2FIX(0);
}
else {
MAKE_TM(time, tobj);
return tobj->vtm.utc_offset;
}
}
|
#wday ⇒ Integer
4832 4833 4834 4835 4836 4837 4838 4839 4840 |
# File 'time.c', line 4832
static VALUE
time_wday(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM_ENSURE(time, tobj, tobj->vtm.wday != VTM_WDAY_INITVAL);
return INT2FIX((int)tobj->vtm.wday);
}
|
#wednesday? ⇒ Boolean
4912 4913 4914 4915 4916 |
# File 'time.c', line 4912
static VALUE
time_wednesday(VALUE time)
{
wday_p(3);
}
|
#xmlschema(fraction_digits = 0) ⇒ String Also known as: iso8601
Returns a string which represents the time as a dateTime defined by XML Schema:
CCYY-MM-DDThh:mm:ssTZD
CCYY-MM-DDThh:mm:ss.sssTZD
where TZD is Z or [+-]hh:mm.
If self is a UTC time, Z is used as TZD. [+-]hh:mm is used otherwise.
fraction_digits
specifies a number of digits to use for fractional seconds. Its default value is 0.
t = Time.now
t.xmlschema # => "2011-10-05T22:26:12-04:00"
5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 |
# File 'time.c', line 5298
static VALUE
time_xmlschema(int argc, VALUE *argv, VALUE time)
{
long fraction_digits = 0;
rb_check_arity(argc, 0, 1);
if (argc > 0) {
fraction_digits = NUM2LONG(argv[0]);
if (fraction_digits < 0) {
fraction_digits = 0;
}
}
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
const long size_after_year = sizeof("-MM-DDTHH:MM:SS+ZH:ZM") + fraction_digits
+ (fraction_digits > 0);
VALUE str;
char *ptr;
# define fill_digits_long(len, prec, n) \
for (int fill_it = 1, written = snprintf(ptr, len, "%0*ld", prec, n); \
fill_it; ptr += written, fill_it = 0)
if (FIXNUM_P(tobj->vtm.year)) {
long year = FIX2LONG(tobj->vtm.year);
int year_width = (year < 0) + rb_strlen_lit("YYYY");
int w = (year >= -9999 && year <= 9999 ? year_width : (year < 0) + (int)DECIMAL_SIZE_OF(year));
str = rb_usascii_str_new(0, w + size_after_year);
ptr = RSTRING_PTR(str);
fill_digits_long(w + 1, year_width, year) {
if (year >= -9999 && year <= 9999) {
RUBY_ASSERT(written == year_width);
}
else {
RUBY_ASSERT(written >= year_width);
RUBY_ASSERT(written <= w);
}
}
}
else {
str = rb_int2str(tobj->vtm.year, 10);
rb_str_modify_expand(str, size_after_year);
ptr = RSTRING_END(str);
}
# define fill_2(c, n) (*ptr++ = c, *ptr++ = '0' + (n) / 10, *ptr++ = '0' + (n) % 10)
fill_2('-', tobj->vtm.mon);
fill_2('-', tobj->vtm.mday);
fill_2('T', tobj->vtm.hour);
fill_2(':', tobj->vtm.min);
fill_2(':', tobj->vtm.sec);
if (fraction_digits > 0) {
VALUE subsecx = tobj->vtm.subsecx;
long subsec;
int digits = -1;
*ptr++ = '.';
if (fraction_digits <= TIME_SCALE_NUMDIGITS) {
digits = TIME_SCALE_NUMDIGITS - (int)fraction_digits;
}
else {
long w = fraction_digits - TIME_SCALE_NUMDIGITS; /* > 0 */
subsecx = mulv(subsecx, rb_int_positive_pow(10, (unsigned long)w));
if (!RB_INTEGER_TYPE_P(subsecx)) { /* maybe Rational */
subsecx = rb_Integer(subsecx);
}
if (FIXNUM_P(subsecx)) digits = 0;
}
if (digits >= 0 && fraction_digits < INT_MAX) {
subsec = NUM2LONG(subsecx);
if (digits > 0) subsec /= (long)pow(10, digits);
fill_digits_long(fraction_digits + 1, (int)fraction_digits, subsec) {
RUBY_ASSERT(written == (int)fraction_digits);
}
}
else {
subsecx = rb_int2str(subsecx, 10);
long len = RSTRING_LEN(subsecx);
if (fraction_digits > len) {
memset(ptr, '0', fraction_digits - len);
}
else {
len = fraction_digits;
}
ptr += fraction_digits;
memcpy(ptr - len, RSTRING_PTR(subsecx), len);
}
}
if (TZMODE_UTC_P(tobj)) {
*ptr = 'Z';
ptr++;
}
else {
long offset = NUM2LONG(rb_time_utc_offset(time));
char sign = offset < 0 ? '-' : '+';
if (offset < 0) offset = -offset;
offset /= 60;
fill_2(sign, offset / 60);
fill_2(':', offset % 60);
}
const char *const start = RSTRING_PTR(str);
rb_str_set_len(str, ptr - start); // We could skip coderange scanning as we know it's full ASCII.
return str;
}
|
#yday ⇒ Integer
4982 4983 4984 4985 4986 4987 4988 4989 4990 |
# File 'time.c', line 4982
static VALUE
time_yday(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM_ENSURE(time, tobj, tobj->vtm.yday != 0);
return INT2FIX(tobj->vtm.yday);
}
|
#year ⇒ Integer
4807 4808 4809 4810 4811 4812 4813 4814 4815 |
# File 'time.c', line 4807
static VALUE
time_year(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return tobj->vtm.year;
}
|
#zone ⇒ String
5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 |
# File 'time.c', line 5030
static VALUE
time_zone(VALUE time)
{
struct time_object *tobj;
VALUE zone;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
if (TZMODE_UTC_P(tobj)) {
return rb_usascii_str_new_cstr("UTC");
}
zone = tobj->vtm.zone;
if (NIL_P(zone))
return Qnil;
if (RB_TYPE_P(zone, T_STRING))
zone = rb_str_dup(zone);
return zone;
}
|