Class: Time
Class Method Summary collapse
- 
  
    
      .local(*args)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Like Time.utc, except that the returned Timeobject has the local timezone, not the UTC timezone:.
- 
  
    
      .utc(*args)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns a new Timeobject based the on given arguments, in the UTC timezone.
Instance Method Summary collapse
- 
  
    
      #+(numeric)  ⇒ Time 
    
    
  
  
  
  
  
  
  
  
  
    Returns a new Timeobject whose value is the sum of the numeric value ofselfand the givennumeric:.
- 
  
    
      #-(time2)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    When numericis given, returns a newTimeobject whose value is the difference of the numeric value ofselfandnumeric:.
- 
  
    
      #<=>(other_time)  ⇒ -1, ... 
    
    
  
  
  
  
  
  
  
  
  
    Compares selfwithother_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 Timeobject whose numerical value is greater than or equal toselfwith 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 trueifselfis in daylight saving time,falseotherwise:.
- 
  
    
      #eql?(other_time)  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    Returns trueifselfandother_timeare bothTimeobjects with the exact same time value.
- 
  
    
      #floor(ndigits = 0)  ⇒ Time 
    
    
  
  
  
  
  
  
  
  
  
    Returns a new Timeobject whose numerical value is less than or equal toselfwith its seconds truncated to precisionndigits:.
- 
  
    
      #friday?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    Returns trueifselfrepresents a Friday,falseotherwise:.
- 
  
    
      #getutc  ⇒ Time 
    
    
  
  
  
  
  
  
  
  
  
    Returns a new Timeobject representing the value ofselfconverted to the UTC timezone:.
- 
  
    
      #getlocal(zone = nil)  ⇒ Time 
    
    
  
  
  
  
  
  
  
  
  
    Returns a new Timeobject representing the value ofselfconverted to a given timezone; ifzoneisnil, the local timezone is used:.
- 
  
    
      #getutc  ⇒ Time 
    
    
  
  
  
  
  
  
  
  
  
    Returns a new Timeobject representing the value ofselfconverted to the UTC timezone:.
- 
  
    
      #utc?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    Returns trueifselfrepresents 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 selfwith subseconds:.
- 
  
    
      #dst?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    Returns trueifselfis in daylight saving time,falseotherwise:.
- 
  
    
      #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 trueifselfrepresents a Monday,falseotherwise:.
- 
  
    
      #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 selfin the range (0..999_999_999); lower-order digits are truncated, not rounded:.
- 
  
    
      #round(ndigits = 0)  ⇒ Time 
    
    
  
  
  
  
  
  
  
  
  
    Returns a new Timeobject whose numeric value is that ofself, with its seconds value rounded to precisionndigits:.
- 
  
    
      #saturday?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    Returns trueifselfrepresents a Saturday,falseotherwise:.
- 
  
    
      #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 selfas a Numeric (Integer or Rational):.
- 
  
    
      #sunday?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    Returns trueifselfrepresents a Sunday,falseotherwise:.
- 
  
    
      #thursday?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    Returns trueifselfrepresents a Thursday,falseotherwise:.
- 
  
    
      #to_a  ⇒ Array 
    
    
  
  
  
  
  
  
  
  
  
    Returns a 10-element array of values representing self:.
- 
  
    
      #to_f  ⇒ Float 
    
    
  
  
  
  
  
  
  
  
  
    Returns the value of selfas a Float number Epoch seconds; subseconds are included.
- 
  
    
      #to_i  ⇒ Integer 
    
    
  
  
  
  
  
  
  
  
  
    Returns the value of selfas integer Epoch seconds; subseconds are truncated (not rounded):.
- 
  
    
      #to_r  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns the value of selfas a Rational exact number of Epoch seconds;.
- 
  
    
      #to_s  ⇒ String 
    
    
  
  
  
  
  
  
  
  
  
    Returns a string representation of self, without subseconds:.
- 
  
    
      #tuesday?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    Returns trueifselfrepresents a Tuesday,falseotherwise:.
- 
  
    
      #nsec  ⇒ Integer 
    
    
  
  
  
  
  
  
  
  
  
    Returns the number of nanoseconds in the subseconds part of selfin the range (0..999_999_999); lower-order digits are truncated, not rounded:.
- 
  
    
      #to_i  ⇒ Integer 
    
    
  
  
  
  
  
  
  
  
  
    Returns the value of selfas integer Epoch seconds; subseconds are truncated (not rounded):.
- 
  
    
      #usec  ⇒ Integer 
    
    
  
  
  
  
  
  
  
  
  
    Returns the number of microseconds in the subseconds part of selfin the range (0..999_999); lower-order digits are truncated, not rounded:.
- 
  
    
      #usec  ⇒ Integer 
    
    
  
  
  
  
  
  
  
  
  
    Returns the number of microseconds in the subseconds part of selfin 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 trueifselfrepresents 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 trueifselfrepresents a Wednesday,falseotherwise:.
- 
  
    
      #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, andusecare 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 ifusecis 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, ifselfis less thanother_time.
- 
0, ifselfis equal toother_time.
- 
1, ifselfis greater thenother_time.
- 
nil, ifselfandother_timeare 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 selfifselfis a local time.
- 
Otherwise returns a new Timein 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;
} |