Class: Time
Overview
Time is an abstraction of dates and times. Time is stored internally as the number of seconds with subsecond since the Epoch, 1970-01-01 00:00:00 UTC.
The Time class treats GMT (Greenwich Mean Time) and UTC (Coordinated Universal Time) as equivalent. GMT is the older way of referring to these baseline times but persists in the names of calls on POSIX systems.
All times may have subsecond. Be aware of this fact when comparing times with each other – times that are apparently equal when displayed may be different when compared. (Since Ruby 2.7.0, Time#inspect shows subsecond but Time#to_s still doesn’t show subsecond.)
Since Ruby 1.9.2, Time implementation uses a signed 63 bit integer, Bignum or Rational. The integer is a number of nanoseconds since the Epoch which can represent 1823-11-12 to 2116-02-20. When Bignum or Rational is used (before 1823, after 2116, under nanosecond), Time works slower as when integer is used.
Examples
All of these examples were done using the EST timezone which is GMT-5.
Creating a new Time instance
You can create a new instance of Time with Time.new. This will use the current system time. Time.now is an alias for this. You can also pass parts of the time to Time.new such as year, month, minute, etc. When you want to construct a time this way you must pass at least a year. If you pass the year with nothing else time will default to January 1 of that year at 00:00:00 with the current system timezone. Here are some examples:
Time.new(2002) #=> 2002-01-01 00:00:00 -0500
Time.new(2002, 10) #=> 2002-10-01 00:00:00 -0500
Time.new(2002, 10, 31) #=> 2002-10-31 00:00:00 -0500
You can pass a UTC offset:
Time.new(2002, 10, 31, 2, 2, 2, "+02:00") #=> 2002-10-31 02:02:02 +0200
Or a timezone object:
tz = timezone("Europe/Athens") # Eastern European Time, UTC+2
Time.new(2002, 10, 31, 2, 2, 2, tz) #=> 2002-10-31 02:02:02 +0200
You can also use Time.local and Time.utc to infer local and UTC timezones instead of using the current system setting.
You can also create a new time using Time.at which takes the number of seconds (with subsecond) since the Unix Epoch.
Time.at(628232400) #=> 1989-11-28 00:00:00 -0500
Working with an instance of Time
Once you have an instance of Time there is a multitude of things you can do with it. Below are some examples. For all of the following examples, we will work on the assumption that you have done the following:
t = Time.new(1993, 02, 24, 12, 0, 0, "+09:00")
Was that a monday?
t.monday? #=> false
What year was that again?
t.year #=> 1993
Was it daylight savings at the time?
t.dst? #=> false
What’s the day a year later?
t + (60*60*24*365) #=> 1994-02-24 12:00:00 +0900
How many seconds was that since the Unix Epoch?
t.to_i #=> 730522800
You can also do standard functions like compare two times.
t1 = Time.new(2010)
t2 = Time.new(2011)
t1 == t2 #=> false
t1 == t1 #=> true
t1 < t2 #=> true
t1 > t2 #=> false
Time.new(2010,10,31).between?(t1, t2) #=> true
Timezone argument
A timezone argument must have local_to_utc
and utc_to_local
methods, and may have name
, abbr
, and dst?
methods.
The local_to_utc
method should convert a Time-like object from the timezone to UTC, and utc_to_local
is the opposite. The result also should be a Time or Time-like object (not necessary to be the same class). The #zone of the result is just ignored. Time-like argument to these methods is similar to a Time object in UTC without subsecond; it has attribute readers for the parts, e.g. #year, #month, and so on, and epoch time readers, #to_i. The subsecond attributes are fixed as 0, and #utc_offset, #zone, #isdst, and their aliases are same as a Time object in UTC. Also #to_time, #+, and #- methods are defined.
The name
method is used for marshaling. If this method is not defined on a timezone object, Time objects using that timezone object can not be dumped by Marshal.
The abbr
method is used by ‘%Z’ in #strftime.
The dst?
method is called with a Time
value and should return whether the Time
value is in daylight savings time in the zone.
Auto conversion to Timezone
At loading marshaled data, a timezone name will be converted to a timezone object by find_timezone
class method, if the method is defined.
Similarly, that class method will be called when a timezone argument does not have the necessary methods mentioned above.
Class Method Summary collapse
-
.at(*args) ⇒ Object
Creates a new Time object with the value given by
time
, the given number ofseconds_with_frac
, orseconds
andmicroseconds_with_frac
since the Epoch. -
.gm(*args) ⇒ Object
Creates a Time object based on given values, interpreted as UTC (GMT).
-
.local(*args) ⇒ Object
Same as Time.utc, but interprets the values in the local time zone.
-
.mktime(*args) ⇒ Object
Same as Time.utc, but interprets the values in the local time zone.
-
.now ⇒ Time
Creates a new Time object for the current time.
-
.utc(*args) ⇒ Object
Creates a Time object based on given values, interpreted as UTC (GMT).
Instance Method Summary collapse
-
#+(numeric) ⇒ Time
Adds some number of seconds (possibly including subsecond) to time and returns that value as a new Time object.
-
#-(time2) ⇒ Object
Returns a difference in seconds as a Float between time and
other_time
, or subtracts the given number of seconds innumeric
from time. -
#<=>(other_time) ⇒ -1, ...
Compares
time
withother_time
. -
#_dump(*args) ⇒ Object
private
:nodoc:.
-
#asctime ⇒ Object
Returns a canonical string representation of time.
-
#ceil([ndigits]) ⇒ Time
Ceils subsecond to a given precision in decimal digits (0 digits by default).
-
#ctime ⇒ Object
Returns a canonical string representation of time.
-
#day ⇒ Object
Returns the day of the month (1..31) for time.
-
#dst? ⇒ Object
Returns
true
if time occurs during Daylight Saving Time in its time zone. -
#eql?(other_time) ⇒ Boolean
Returns
true
if time andother_time
are both Time objects with the same seconds (including subsecond) from the Epoch. -
#floor([ndigits]) ⇒ Time
Floors subsecond to a given precision in decimal digits (0 digits by default).
-
#friday? ⇒ Boolean
Returns
true
if time represents Friday. -
#getgm ⇒ Object
Returns a new Time object representing time in UTC.
-
#getlocal(*args) ⇒ Object
Returns a new Time object representing time in local time (using the local time zone in effect for this process).
-
#getutc ⇒ Object
Returns a new Time object representing time in UTC.
-
#gmt? ⇒ Object
Returns
true
if time represents a time in UTC (GMT). -
#gmt_offset ⇒ Object
Returns the offset in seconds between the timezone of time and UTC.
-
#gmtime ⇒ Object
Converts time to UTC (GMT), modifying the receiver.
-
#gmtoff ⇒ Object
Returns the offset in seconds between the timezone of time and UTC.
-
#hash ⇒ Integer
Returns a hash code for this Time object.
-
#hour ⇒ Integer
Returns the hour of the day (0..23) for time.
-
#initialize(*args) ⇒ Object
constructor
Returns a Time object.
-
#initialize_copy(time) ⇒ Object
:nodoc:.
-
#inspect ⇒ String
Returns a detailed string representing time.
-
#isdst ⇒ Object
Returns
true
if time occurs during Daylight Saving Time in its time zone. -
#localtime(*args) ⇒ Object
Converts time to local time (using the local time zone in effect at the creation time of time) modifying the receiver.
-
#marshal_dump ⇒ Object
private
:nodoc:.
-
#marshal_load(str) ⇒ Object
private
:nodoc:.
-
#mday ⇒ Object
Returns the day of the month (1..31) for time.
-
#min ⇒ Integer
Returns the minute of the hour (0..59) for time.
-
#mon ⇒ Object
Returns the month of the year (1..12) for time.
-
#monday? ⇒ Boolean
Returns
true
if time represents Monday. -
#month ⇒ Object
Returns the month of the year (1..12) for time.
-
#nsec ⇒ Object
Returns the number of nanoseconds for the subsecond part of time.
-
#round([ndigits]) ⇒ Time
Rounds subsecond to a given precision in decimal digits (0 digits by default).
-
#saturday? ⇒ Boolean
Returns
true
if time represents Saturday. -
#sec ⇒ Integer
Returns the second of the minute (0..60) for time.
-
#strftime(string) ⇒ String
Formats time according to the directives in the given format string.
-
#subsec ⇒ Numeric
Returns the subsecond for time.
-
#sunday? ⇒ Boolean
Returns
true
if time represents Sunday. -
#thursday? ⇒ Boolean
Returns
true
if time represents Thursday. -
#to_a ⇒ Array
Returns a ten-element array of values for time:.
-
#to_f ⇒ Float
Returns the value of time as a floating point number of seconds since the Epoch.
-
#to_i ⇒ Object
Returns the value of time as an integer number of seconds since the Epoch.
-
#to_r ⇒ Object
Returns the value of time as a rational number of seconds since the Epoch.
-
#to_s ⇒ String
Returns a string representing time.
-
#tuesday? ⇒ Boolean
Returns
true
if time represents Tuesday. -
#tv_nsec ⇒ Object
Returns the number of nanoseconds for the subsecond part of time.
-
#tv_sec ⇒ Object
Returns the value of time as an integer number of seconds since the Epoch.
-
#tv_usec ⇒ Object
Returns the number of microseconds for the subsecond part of time.
-
#usec ⇒ Object
Returns the number of microseconds for the subsecond part of time.
-
#utc ⇒ Object
Converts time to UTC (GMT), modifying the receiver.
-
#utc? ⇒ Object
Returns
true
if time represents a time in UTC (GMT). -
#utc_offset ⇒ Object
Returns the offset in seconds between the timezone of time and UTC.
-
#wday ⇒ Integer
Returns an integer representing the day of the week, 0..6, with Sunday == 0.
-
#wednesday? ⇒ Boolean
Returns
true
if time represents Wednesday. -
#yday ⇒ Integer
Returns an integer representing the day of the year, 1..366.
-
#year ⇒ Integer
Returns the year for time (including the century).
-
#zone ⇒ String
Returns the name of the time zone used for time.
Methods included from Comparable
#<, #<=, #==, #>, #>=, #between?, #clamp
Constructor Details
#new ⇒ Time #new(year, month = nil, day = nil, hour = nil, min = nil, sec = nil, tz = nil) ⇒ Time
Returns a Time object.
It is initialized to the current system time if no argument is given.
Note: The new object will use the resolution available on your system clock, and may include subsecond.
If one or more arguments are specified, the time is initialized to the specified time.
sec
may have subsecond if it is a rational.
tz
specifies the timezone. It can be an offset from UTC, given either as a string such as “+09:00” or a single letter “A”..“Z” excluding “J” (so-called military time zone), or as a number of seconds such as 32400. Or it can be a timezone object, see Timezone argument for details.
a = Time.new #=> 2020-07-21 01:27:44.917547285 +0900
b = Time.new #=> 2020-07-21 01:27:44.917617713 +0900
a == b #=> false
"%.6f" % a.to_f #=> "1595262464.917547"
"%.6f" % b.to_f #=> "1595262464.917618"
Time.new(2008,6,21, 13,30,0, "+09:00") #=> 2008-06-21 13:30:00 +0900
# A trip for RubyConf 2007
t1 = Time.new(2007,11,1,15,25,0, "+09:00") # JST (Narita)
t2 = Time.new(2007,11,1,12, 5,0, "-05:00") # CDT (Minneapolis)
t3 = Time.new(2007,11,1,13,25,0, "-05:00") # CDT (Minneapolis)
t4 = Time.new(2007,11,1,16,53,0, "-04:00") # EDT (Charlotte)
t5 = Time.new(2007,11,5, 9,24,0, "-05:00") # EST (Charlotte)
t6 = Time.new(2007,11,5,11,21,0, "-05:00") # EST (Detroit)
t7 = Time.new(2007,11,5,13,45,0, "-05:00") # EST (Detroit)
t8 = Time.new(2007,11,6,17,10,0, "+09:00") # JST (Narita)
(t2-t1)/3600.0 #=> 10.666666666666666
(t4-t3)/3600.0 #=> 2.466666666666667
(t6-t5)/3600.0 #=> 1.95
(t8-t7)/3600.0 #=> 13.416666666666666
2443 2444 2445 2446 2447 2448 2449 2450 |
# File 'time.c', line 2443
static VALUE
time_init(int argc, VALUE *argv, VALUE time)
{
if (argc == 0)
return time_init_0(time);
else
return time_init_1(argc, argv, time);
}
|
Class Method Details
.at(time) ⇒ Time .at(seconds_with_frac) ⇒ Time .at(seconds, microseconds_with_frac) ⇒ Time .at(seconds, milliseconds, : millisecond) ⇒ Time .at(seconds, microseconds, : usec) ⇒ Time .at(seconds, microseconds, : microsecond) ⇒ Time .at(seconds, nanoseconds, : nsec) ⇒ Time .at(seconds, nanoseconds, : nanosecond) ⇒ Time .at(time) ⇒ Time .at(seconds_with_frac) ⇒ Time .at(seconds, microseconds_with_frac) ⇒ Time .at(seconds, milliseconds, : millisecond) ⇒ Time .at(seconds, microseconds, : usec) ⇒ Time .at(seconds, microseconds, : microsecond) ⇒ Time .at(seconds, nanoseconds, : nsec) ⇒ Time .at(seconds, nanoseconds, : nanosecond) ⇒ Time
Creates a new Time object with the value given by time
, the given number of seconds_with_frac
, or seconds
and microseconds_with_frac
since the Epoch. seconds_with_frac
and microseconds_with_frac
can be an Integer, Float, Rational, or other Numeric.
If in
argument is given, the result is in that timezone or UTC offset, or if a numeric argument is given, the result is in local time. The in
argument accepts the same types of arguments as tz
argument of Time.new: string, number of seconds, or a timezone object.
Time.at(0) #=> 1969-12-31 18:00:00 -0600
Time.at(Time.at(0)) #=> 1969-12-31 18:00:00 -0600
Time.at(946702800) #=> 1999-12-31 23:00:00 -0600
Time.at(-284061600) #=> 1960-12-31 00:00:00 -0600
Time.at(946684800.2).usec #=> 200000
Time.at(946684800, 123456.789).nsec #=> 123456789
Time.at(946684800, 123456789, :nsec).nsec #=> 123456789
Time.at(1582721899, in: "+09:00") #=> 2020-02-26 21:58:19 +0900
Time.at(1582721899, in: "UTC") #=> 2020-02-26 12:58:19 UTC
Time.at(1582721899, in: "C") #=> 2020-02-26 13:58:19 +0300
Time.at(1582721899, in: 32400) #=> 2020-02-26 21:58:19 +0900
require 'tzinfo'
Time.at(1582721899, in: TZInfo::Timezone.get('Europe/Kiev'))
#=> 2020-02-26 14:58:19 +0200
2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 |
# File 'time.c', line 2831
static VALUE
time_s_at(int argc, VALUE *argv, VALUE klass)
{
VALUE time, t, unit = Qundef, zone = Qundef, opts;
VALUE vals[TMOPT_MAX_];
wideval_t timew;
argc = rb_scan_args(argc, argv, "12:", &time, &t, &unit, &opts);
if (get_tmopt(opts, vals)) {
zone = vals[0];
}
if (argc >= 2) {
int scale = argc == 3 ? get_scale(unit) : 1000000;
time = num_exact(time);
t = num_exact(t);
timew = wadd(rb_time_magnify(v2w(time)), wmulquoll(v2w(t), TIME_SCALE, scale));
t = time_new_timew(klass, timew);
}
else if (IsTimeval(time)) {
struct time_object *tobj, *tobj2;
GetTimeval(time, tobj);
t = time_new_timew(klass, tobj->timew);
GetTimeval(t, tobj2);
TZMODE_COPY(tobj2, tobj);
}
else {
timew = rb_time_magnify(v2w(num_exact(time)));
t = time_new_timew(klass, timew);
}
if (zone != Qundef) {
time_zonelocal(t, zone);
}
return t;
}
|
.utc(year) ⇒ Time .utc(year, month) ⇒ Time .utc(year, month, day) ⇒ Time .utc(year, month, day, hour) ⇒ Time .utc(year, month, day, hour, min) ⇒ Time .utc(year, month, day, hour, min, sec_with_frac) ⇒ Time .utc(year, month, day, hour, min, sec, usec_with_frac) ⇒ Time .utc(sec, min, hour, day, month, year, dummy, dummy, dummy, dummy) ⇒ Time .gm(year) ⇒ Time .gm(year, month) ⇒ Time .gm(year, month, day) ⇒ Time .gm(year, month, day, hour) ⇒ Time .gm(year, month, day, hour, min) ⇒ Time .gm(year, month, day, hour, min, sec_with_frac) ⇒ Time .gm(year, month, day, hour, min, sec, usec_with_frac) ⇒ Time .gm(sec, min, hour, day, month, year, dummy, dummy, dummy, dummy) ⇒ Time
Creates a Time object based on given values, interpreted as UTC (GMT). The year must be specified. Other values default to the minimum value for that field (and may be nil
or omitted). Months may be specified by numbers from 1 to 12, or by the three-letter English month names. Hours are specified on a 24-hour clock (0..23). Raises an ArgumentError if any values are out of range. Will also accept ten arguments in the order output by Time#to_a.
sec_with_frac
and usec_with_frac
can have a fractional part.
Time.utc(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
3493 3494 3495 3496 3497 3498 3499 3500 |
# File 'time.c', line 3493
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)));
}
|
.local(year) ⇒ Time .local(year, month) ⇒ Time .local(year, month, day) ⇒ Time .local(year, month, day, hour) ⇒ Time .local(year, month, day, hour, min) ⇒ Time .local(year, month, day, hour, min, sec_with_frac) ⇒ Time .local(year, month, day, hour, min, sec, usec_with_frac) ⇒ Time .local(sec, min, hour, day, month, year, dummy, dummy, isdst, dummy) ⇒ Time .mktime(year) ⇒ Time .mktime(year, month) ⇒ Time .mktime(year, month, day) ⇒ Time .mktime(year, month, day, hour) ⇒ Time .mktime(year, month, day, hour, min) ⇒ Time .mktime(year, month, day, hour, min, sec_with_frac) ⇒ Time .mktime(year, month, day, hour, min, sec, usec_with_frac) ⇒ Time .mktime(sec, min, hour, day, month, year, dummy, dummy, isdst, dummy) ⇒ Time
Same as Time.utc, but interprets the values in the local time zone.
Time.local(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 -0600
3527 3528 3529 3530 3531 3532 3533 3534 |
# File 'time.c', line 3527
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)));
}
|
.local(year) ⇒ Time .local(year, month) ⇒ Time .local(year, month, day) ⇒ Time .local(year, month, day, hour) ⇒ Time .local(year, month, day, hour, min) ⇒ Time .local(year, month, day, hour, min, sec_with_frac) ⇒ Time .local(year, month, day, hour, min, sec, usec_with_frac) ⇒ Time .local(sec, min, hour, day, month, year, dummy, dummy, isdst, dummy) ⇒ Time .mktime(year) ⇒ Time .mktime(year, month) ⇒ Time .mktime(year, month, day) ⇒ Time .mktime(year, month, day, hour) ⇒ Time .mktime(year, month, day, hour, min) ⇒ Time .mktime(year, month, day, hour, min, sec_with_frac) ⇒ Time .mktime(year, month, day, hour, min, sec, usec_with_frac) ⇒ Time .mktime(sec, min, hour, day, month, year, dummy, dummy, isdst, dummy) ⇒ Time
3527 3528 3529 3530 3531 3532 3533 3534 |
# File 'time.c', line 3527
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)));
}
|
.now ⇒ Time
Creates a new Time object for the current time. This is same as Time.new without arguments.
Time.now #=> 2009-06-24 12:39:54 +0900
2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 |
# File 'time.c', line 2752
static VALUE
time_s_now(int argc, VALUE *argv, VALUE klass)
{
VALUE vals[TMOPT_MAX_], opts, t, zone = Qundef;
rb_scan_args(argc, argv, ":", &opts);
if (get_tmopt(opts, vals)) zone = vals[TMOPT_IN];
t = rb_class_new_instance(0, NULL, klass);
if (zone != Qundef) {
time_zonelocal(t, zone);
}
return t;
}
|
.utc(year) ⇒ Time .utc(year, month) ⇒ Time .utc(year, month, day) ⇒ Time .utc(year, month, day, hour) ⇒ Time .utc(year, month, day, hour, min) ⇒ Time .utc(year, month, day, hour, min, sec_with_frac) ⇒ Time .utc(year, month, day, hour, min, sec, usec_with_frac) ⇒ Time .utc(sec, min, hour, day, month, year, dummy, dummy, dummy, dummy) ⇒ Time .gm(year) ⇒ Time .gm(year, month) ⇒ Time .gm(year, month, day) ⇒ Time .gm(year, month, day, hour) ⇒ Time .gm(year, month, day, hour, min) ⇒ Time .gm(year, month, day, hour, min, sec_with_frac) ⇒ Time .gm(year, month, day, hour, min, sec, usec_with_frac) ⇒ Time .gm(sec, min, hour, day, month, year, dummy, dummy, dummy, dummy) ⇒ Time
Creates a Time object based on given values, interpreted as UTC (GMT). The year must be specified. Other values default to the minimum value for that field (and may be nil
or omitted). Months may be specified by numbers from 1 to 12, or by the three-letter English month names. Hours are specified on a 24-hour clock (0..23). Raises an ArgumentError if any values are out of range. Will also accept ten arguments in the order output by Time#to_a.
sec_with_frac
and usec_with_frac
can have a fractional part.
Time.utc(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
3493 3494 3495 3496 3497 3498 3499 3500 |
# File 'time.c', line 3493
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
4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 |
# File 'time.c', line 4221
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);
}
|
#-(other_time) ⇒ Float #-(numeric) ⇒ Time
Returns a difference in seconds as a Float between time and other_time
, or subtracts the given number of seconds in numeric
from time.
t = Time.now #=> 2020-07-20 22:15:49.302766336 +0900
t2 = t + 2592000 #=> 2020-08-19 22:15:49.302766336 +0900
t2 - t #=> 2592000.0
t2 - 2592000 #=> 2020-07-20 22:15:49.302766336 +0900
4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 |
# File 'time.c', line 4248
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 time
with other_time
.
-1, 0, +1 or nil depending on whether time
is less than, equal to, or greater than other_time
.
nil
is returned if the two values are incomparable.
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
3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 |
# File 'time.c', line 3737
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:
5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 |
# File 'time.c', line 5250
static VALUE
time_dump(int argc, VALUE *argv, VALUE time)
{
VALUE str;
rb_check_arity(argc, 0, 1);
str = time_mdump(time);
return str;
}
|
#asctime ⇒ String #ctime ⇒ String
4107 4108 4109 4110 4111 |
# File 'time.c', line 4107
static VALUE
time_asctime(VALUE time)
{
return strftimev("%a %b %e %T %Y", time, rb_usascii_encoding());
}
|
#ceil([ndigits]) ⇒ Time
Ceils subsecond to a given precision in decimal digits (0 digits by default). It returns a new Time object. ndigits
should be zero or a positive integer.
t = Time.utc(2010,3,30, 5,43,25.0123456789r)
t #=> 2010-03-30 05:43:25 123456789/10000000000 UTC
t.ceil #=> 2010-03-30 05:43:26 UTC
t.ceil(0) #=> 2010-03-30 05:43:26 UTC
t.ceil(1) #=> 2010-03-30 05:43:25.1 UTC
t.ceil(2) #=> 2010-03-30 05:43:25.02 UTC
t.ceil(3) #=> 2010-03-30 05:43:25.013 UTC
t.ceil(4) #=> 2010-03-30 05:43:25.0124 UTC
t = Time.utc(1999,12,31, 23,59,59)
(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
t = Time.utc(1999,12,31, 23,59,59)
(t + 0.123456789).ceil(4) #=> 1999-12-31 23:59:59.1235 UTC
4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 |
# File 'time.c', line 4400
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);
}
|
#asctime ⇒ String #ctime ⇒ String
4107 4108 4109 4110 4111 |
# File 'time.c', line 4107
static VALUE
time_asctime(VALUE time)
{
return strftimev("%a %b %e %T %Y", time, rb_usascii_encoding());
}
|
#day ⇒ Integer #mday ⇒ Integer
4497 4498 4499 4500 4501 4502 4503 4504 4505 |
# File 'time.c', line 4497
static VALUE
time_mday(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.mday);
}
|
#isdst ⇒ Boolean #dst? ⇒ Boolean
Returns true
if time occurs during Daylight Saving Time in its time zone.
# CST6CDT:
Time.local(2000, 1, 1).zone #=> "CST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "CDT"
Time.local(2000, 7, 1).isdst #=> true
Time.local(2000, 7, 1).dst? #=> true
# Asia/Tokyo:
Time.local(2000, 1, 1).zone #=> "JST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "JST"
Time.local(2000, 7, 1).isdst #=> false
Time.local(2000, 7, 1).dst? #=> false
4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 |
# File 'time.c', line 4738
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 tobj->vtm.isdst ? Qtrue : Qfalse;
}
|
#eql?(other_time) ⇒ Boolean
Returns true
if time and other_time
are both Time objects with the same seconds (including subsecond) from the Epoch.
3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 |
# File 'time.c', line 3764
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]) ⇒ Time
Floors subsecond to a given precision in decimal digits (0 digits by default). It returns a new Time object. ndigits
should be zero or a positive integer.
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(0) #=> 2010-03-30 05:43:25 UTC
t.floor(1) #=> 2010-03-30 05:43:25.1 UTC
t.floor(2) #=> 2010-03-30 05:43:25.12 UTC
t.floor(3) #=> 2010-03-30 05:43:25.123 UTC
t.floor(4) #=> 2010-03-30 05:43:25.1234 UTC
t = Time.utc(1999,12,31, 23,59,59)
(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
t = Time.utc(1999,12,31, 23,59,59)
(t + 0.123456789).floor(4) #=> 1999-12-31 23:59:59.1234 UTC
4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 |
# File 'time.c', line 4355
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
4671 4672 4673 4674 4675 |
# File 'time.c', line 4671
static VALUE
time_friday(VALUE time)
{
wday_p(5);
}
|
#getgm ⇒ Time #getutc ⇒ Time
4079 4080 4081 4082 4083 |
# File 'time.c', line 4079
static VALUE
time_getgmtime(VALUE time)
{
return time_gmtime(time_dup(time));
}
|
#getlocal ⇒ Time #getlocal(utc_offset) ⇒ Time #getlocal(timezone) ⇒ Time
Returns a new Time object representing time in local time (using the local time zone in effect for this process).
If utc_offset
is given, it is used instead of the local time. utc_offset
can be given as a human-readable string (eg. "+09:00"
) or as a number of seconds (eg. 32400
).
t = Time.utc(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
l = t.getlocal #=> 2000-01-01 14:15:01 -0600
l.utc? #=> false
t == l #=> true
j = t.getlocal("+09:00") #=> 2000-01-02 05:15:01 +0900
j.utc? #=> false
t == j #=> true
k = t.getlocal(9*60*60) #=> 2000-01-02 05:15:01 +0900
k.utc? #=> false
t == k #=> true
4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 |
# File 'time.c', line 4034
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))) {
if (NIL_P(zone = find_timezone(time, zone))) invalid_utc_offset();
time = time_dup(time);
if (!zone_localtime(zone, time)) invalid_utc_offset();
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));
}
|
#getgm ⇒ Time #getutc ⇒ Time
4079 4080 4081 4082 4083 |
# File 'time.c', line 4079
static VALUE
time_getgmtime(VALUE time)
{
return time_gmtime(time_dup(time));
}
|
#utc? ⇒ Boolean #gmt? ⇒ Boolean
Returns true
if time represents a time in UTC (GMT).
t = Time.now #=> 2007-11-19 08:15:23 -0600
t.utc? #=> false
t = Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
t = Time.now #=> 2007-11-19 08:16:03 -0600
t.gmt? #=> false
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt? #=> true
3795 3796 3797 3798 3799 3800 3801 3802 3803 |
# File 'time.c', line 3795
static VALUE
time_utc_p(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
if (TZMODE_UTC_P(tobj)) return Qtrue;
return Qfalse;
}
|
#gmt_offset ⇒ Integer #gmtoff ⇒ Integer #utc_offset ⇒ Integer
4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 |
# File 'time.c', line 4800
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;
}
}
|
#gmtime ⇒ Time #utc ⇒ Time
3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 |
# File 'time.c', line 3948
static VALUE
time_gmtime(VALUE time)
{
struct time_object *tobj;
struct vtm vtm;
GetTimeval(time, tobj);
if (TZMODE_UTC_P(tobj)) {
if (tobj->tm_got)
return time;
}
else {
time_modify(time);
}
vtm.zone = str_utc;
GMTIMEW(tobj->timew, &vtm);
tobj->vtm = vtm;
tobj->tm_got = 1;
TZMODE_SET_UTC(tobj);
return time;
}
|
#gmt_offset ⇒ Integer #gmtoff ⇒ Integer #utc_offset ⇒ Integer
4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 |
# File 'time.c', line 4800
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 a hash code for this Time object.
See also Object#hash.
3814 3815 3816 3817 3818 3819 3820 3821 |
# File 'time.c', line 3814
static VALUE
time_hash(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
return rb_hash(w2v(tobj->timew));
}
|
#hour ⇒ Integer
4475 4476 4477 4478 4479 4480 4481 4482 4483 |
# File 'time.c', line 4475
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:
3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 |
# File 'time.c', line 3824
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
Returns a detailed string representing time. Unlike to_s, preserves subsecond in the representation for easier debugging.
t = Time.now
t.inspect #=> "2012-11-10 18:16:12.261257655 +0100"
t.strftime "%Y-%m-%d %H:%M:%S.%N %z" #=> "2012-11-10 18:16:12.261257655 +0100"
t.utc.inspect #=> "2012-11-10 17:16:12.261257655 UTC"
t.strftime "%Y-%m-%d %H:%M:%S.%N UTC" #=> "2012-11-10 17:16:12.261257655 UTC"
4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 |
# File 'time.c', line 4155
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 (FIXNUM_P(subsec) && FIX2LONG(subsec) == 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 {
rb_str_concat(str, strftimev(" %z", time, rb_usascii_encoding()));
}
return str;
}
|
#isdst ⇒ Boolean #dst? ⇒ Boolean
Returns true
if time occurs during Daylight Saving Time in its time zone.
# CST6CDT:
Time.local(2000, 1, 1).zone #=> "CST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "CDT"
Time.local(2000, 7, 1).isdst #=> true
Time.local(2000, 7, 1).dst? #=> true
# Asia/Tokyo:
Time.local(2000, 1, 1).zone #=> "JST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "JST"
Time.local(2000, 7, 1).isdst #=> false
Time.local(2000, 7, 1).dst? #=> false
4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 |
# File 'time.c', line 4738
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 tobj->vtm.isdst ? Qtrue : Qfalse;
}
|
#localtime ⇒ Time #localtime(utc_offset) ⇒ Time
Converts time to local time (using the local time zone in effect at the creation time of time) modifying the receiver.
If utc_offset
is given, it is used instead of the local time.
t = Time.utc(2000, "jan", 1, 20, 15, 1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
t.localtime #=> 2000-01-01 14:15:01 -0600
t.utc? #=> false
t.localtime("+09:00") #=> 2000-01-02 05:15:01 +0900
t.utc? #=> false
If utc_offset
is not given and time is local time, just returns the receiver.
3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 |
# File 'time.c', line 3918
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);
}
|
#marshal_dump ⇒ Object (private)
:nodoc:
5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 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 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 |
# File 'time.c', line 5108
static VALUE
time_mdump(VALUE time)
{
struct time_object *tobj;
unsigned long p, s;
char buf[base_dump_size + sizeof(long) + 1];
int i;
VALUE str;
struct vtm vtm;
long year;
long usec, nsec;
VALUE subsecx, nano, subnano, v, zone;
VALUE year_extend = Qnil;
const int max_year = 1900+0xffff;
GetTimeval(time, tobj);
gmtimew(tobj->timew, &vtm);
if (FIXNUM_P(vtm.year)) {
year = FIX2LONG(vtm.year);
if (year > max_year) {
year_extend = INT2FIX(year - max_year);
year = max_year;
}
else if (year < 1900) {
year_extend = LONG2NUM(1900 - year);
year = 1900;
}
}
else {
if (rb_int_positive_p(vtm.year)) {
year_extend = rb_int_minus(vtm.year, INT2FIX(max_year));
year = max_year;
}
else {
year_extend = rb_int_minus(INT2FIX(1900), vtm.year);
year = 1900;
}
}
subsecx = vtm.subsecx;
nano = mulquov(subsecx, INT2FIX(1000000000), INT2FIX(TIME_SCALE));
divmodv(nano, INT2FIX(1), &v, &subnano);
nsec = FIX2LONG(v);
usec = nsec / 1000;
nsec = nsec % 1000;
nano = addv(LONG2FIX(nsec), subnano);
p = 0x1UL << 31 | /* 1 */
TZMODE_UTC_P(tobj) << 30 | /* 1 */
(year-1900) << 14 | /* 16 */
(vtm.mon-1) << 10 | /* 4 */
vtm.mday << 5 | /* 5 */
vtm.hour; /* 5 */
s = (unsigned long)vtm.min << 26 | /* 6 */
vtm.sec << 20 | /* 6 */
usec; /* 20 */
for (i=0; i<4; i++) {
buf[i] = (unsigned char)p;
p = RSHIFT(p, 8);
}
for (i=4; i<8; i++) {
buf[i] = (unsigned char)s;
s = RSHIFT(s, 8);
}
if (!NIL_P(year_extend)) {
/*
* Append extended year distance from 1900..(1900+0xffff). In
* each cases, there is no sign as the value is positive. The
* format is length (marshaled long) + little endian packed
* binary (like as Fixnum and Bignum).
*/
size_t ysize = rb_absint_size(year_extend, NULL);
char *p, *const buf_year_extend = buf + base_dump_size;
if (ysize > LONG_MAX ||
(i = ruby_marshal_write_long((long)ysize, buf_year_extend)) < 0) {
rb_raise(rb_eArgError, "year too %s to marshal: %"PRIsVALUE" UTC",
(year == 1900 ? "small" : "big"), vtm.year);
}
i += base_dump_size;
str = rb_str_new(NULL, i + ysize);
p = RSTRING_PTR(str);
memcpy(p, buf, i);
p += i;
rb_integer_pack(year_extend, p, ysize, 1, 0, INTEGER_PACK_LITTLE_ENDIAN);
}
else {
str = rb_str_new(buf, base_dump_size);
}
rb_copy_generic_ivar(str, time);
if (!rb_equal(nano, INT2FIX(0))) {
if (RB_TYPE_P(nano, T_RATIONAL)) {
rb_ivar_set(str, id_nano_num, RRATIONAL(nano)->num);
rb_ivar_set(str, id_nano_den, RRATIONAL(nano)->den);
}
else {
rb_ivar_set(str, id_nano_num, nano);
rb_ivar_set(str, id_nano_den, INT2FIX(1));
}
}
if (nsec) { /* submicro is only for Ruby 1.9.1 compatibility */
/*
* submicro is formatted in fixed-point packed BCD (without sign).
* It represent digits under microsecond.
* For nanosecond resolution, 3 digits (2 bytes) are used.
* However it can be longer.
* Extra digits are ignored for loading.
*/
char buf[2];
int len = (int)sizeof(buf);
buf[1] = (char)((nsec % 10) << 4);
nsec /= 10;
buf[0] = (char)(nsec % 10);
nsec /= 10;
buf[0] |= (char)((nsec % 10) << 4);
if (buf[1] == 0)
len = 1;
rb_ivar_set(str, id_submicro, rb_str_new(buf, len));
}
if (!TZMODE_UTC_P(tobj)) {
VALUE off = rb_time_utc_offset(time), div, mod;
divmodv(off, INT2FIX(1), &div, &mod);
if (rb_equal(mod, INT2FIX(0)))
off = rb_Integer(div);
rb_ivar_set(str, id_offset, off);
}
zone = tobj->vtm.zone;
if (maybe_tzobj_p(zone)) {
zone = rb_funcallv(zone, id_name, 0, 0);
}
rb_ivar_set(str, id_zone, zone);
return str;
}
|
#marshal_load(str) ⇒ Object (private)
:nodoc:
5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 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 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 |
# File 'time.c', line 5284
static VALUE
time_mload(VALUE time, VALUE str)
{
struct time_object *tobj;
unsigned long p, s;
time_t sec;
long usec;
unsigned char *buf;
struct vtm vtm;
int i, gmt;
long nsec;
VALUE submicro, nano_num, nano_den, offset, zone, year;
wideval_t timew;
time_modify(time);
#define get_attr(attr, iffound) \
attr = rb_attr_delete(str, id_##attr); \
if (!NIL_P(attr)) { \
iffound; \
}
get_attr(nano_num, {});
get_attr(nano_den, {});
get_attr(submicro, {});
get_attr(offset, (offset = rb_rescue(validate_utc_offset, offset, 0, Qnil)));
get_attr(zone, (zone = rb_rescue(validate_zone_name, zone, 0, Qnil)));
get_attr(year, {});
#undef get_attr
rb_copy_generic_ivar(time, str);
StringValue(str);
buf = (unsigned char *)RSTRING_PTR(str);
if (RSTRING_LEN(str) < base_dump_size) {
goto invalid_format;
}
p = s = 0;
for (i=0; i<4; i++) {
p |= (unsigned long)buf[i]<<(8*i);
}
for (i=4; i<8; i++) {
s |= (unsigned long)buf[i]<<(8*(i-4));
}
if ((p & (1UL<<31)) == 0) {
gmt = 0;
offset = Qnil;
sec = p;
usec = s;
nsec = usec * 1000;
timew = wadd(rb_time_magnify(TIMET2WV(sec)), wmulquoll(WINT2FIXWV(usec), TIME_SCALE, 1000000));
}
else {
p &= ~(1UL<<31);
gmt = (int)((p >> 30) & 0x1);
if (NIL_P(year)) {
year = INT2FIX(((int)(p >> 14) & 0xffff) + 1900);
}
if (RSTRING_LEN(str) > base_dump_size) {
long len = RSTRING_LEN(str) - base_dump_size;
long ysize = 0;
VALUE year_extend;
const char *ybuf = (const char *)(buf += base_dump_size);
ysize = ruby_marshal_read_long(&ybuf, len);
len -= ybuf - (const char *)buf;
if (ysize < 0 || ysize > len) goto invalid_format;
year_extend = rb_integer_unpack(ybuf, ysize, 1, 0, INTEGER_PACK_LITTLE_ENDIAN);
if (year == INT2FIX(1900)) {
year = rb_int_minus(year, year_extend);
}
else {
year = rb_int_plus(year, year_extend);
}
}
vtm.year = year;
vtm.mon = ((int)(p >> 10) & 0xf) + 1;
vtm.mday = (int)(p >> 5) & 0x1f;
vtm.hour = (int) p & 0x1f;
vtm.min = (int)(s >> 26) & 0x3f;
vtm.sec = (int)(s >> 20) & 0x3f;
vtm.utc_offset = INT2FIX(0);
vtm.yday = vtm.wday = 0;
vtm.isdst = 0;
vtm.zone = str_empty;
usec = (long)(s & 0xfffff);
nsec = usec * 1000;
vtm.subsecx = mulquov(LONG2FIX(nsec), INT2FIX(TIME_SCALE), LONG2FIX(1000000000));
if (nano_num != Qnil) {
VALUE nano = quov(num_exact(nano_num), num_exact(nano_den));
vtm.subsecx = addv(vtm.subsecx, mulquov(nano, INT2FIX(TIME_SCALE), LONG2FIX(1000000000)));
}
else if (submicro != Qnil) { /* for Ruby 1.9.1 compatibility */
unsigned char *ptr;
long len;
int digit;
ptr = (unsigned char*)StringValuePtr(submicro);
len = RSTRING_LEN(submicro);
nsec = 0;
if (0 < len) {
if (10 <= (digit = ptr[0] >> 4)) goto end_submicro;
nsec += digit * 100;
if (10 <= (digit = ptr[0] & 0xf)) goto end_submicro;
nsec += digit * 10;
}
if (1 < len) {
if (10 <= (digit = ptr[1] >> 4)) goto end_submicro;
nsec += digit;
}
vtm.subsecx = addv(vtm.subsecx, mulquov(LONG2FIX(nsec), INT2FIX(TIME_SCALE), LONG2FIX(1000000000)));
end_submicro: ;
}
timew = timegmw(&vtm);
}
GetNewTimeval(time, tobj);
tobj->tzmode = TIME_TZMODE_LOCALTIME;
tobj->tm_got = 0;
tobj->timew = timew;
if (gmt) {
TZMODE_SET_UTC(tobj);
}
else if (!NIL_P(offset)) {
time_set_utc_offset(time, offset);
time_fixoff(time);
}
if (!NIL_P(zone)) {
zone = mload_zone(time, zone);
tobj->vtm.zone = zone;
zone_localtime(zone, time);
}
return time;
invalid_format:
rb_raise(rb_eTypeError, "marshaled time format differ");
UNREACHABLE_RETURN(Qundef);
}
|
#day ⇒ Integer #mday ⇒ Integer
4497 4498 4499 4500 4501 4502 4503 4504 4505 |
# File 'time.c', line 4497
static VALUE
time_mday(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.mday);
}
|
#min ⇒ Integer
4455 4456 4457 4458 4459 4460 4461 4462 4463 |
# File 'time.c', line 4455
static VALUE
time_min(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.min);
}
|
#mon ⇒ Integer #month ⇒ Integer
4519 4520 4521 4522 4523 4524 4525 4526 4527 |
# File 'time.c', line 4519
static VALUE
time_mon(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.mon);
}
|
#monday? ⇒ Boolean
4607 4608 4609 4610 4611 |
# File 'time.c', line 4607
static VALUE
time_monday(VALUE time)
{
wday_p(1);
}
|
#mon ⇒ Integer #month ⇒ Integer
4519 4520 4521 4522 4523 4524 4525 4526 4527 |
# File 'time.c', line 4519
static VALUE
time_mon(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.mon);
}
|
#nsec ⇒ Integer #tv_nsec ⇒ Integer
Returns the number of nanoseconds for the subsecond part of time. The result is a non-negative integer less than 10**9.
t = Time.now #=> 2020-07-20 22:07:10.963933942 +0900
t.nsec #=> 963933942
If time has fraction of nanosecond (such as picoseconds), it is truncated.
t = Time.new(2000,1,1,0,0,0.666_777_888_999r)
t.nsec #=> 666777888
Time#subsec can be used to obtain the subsecond part exactly.
3673 3674 3675 3676 3677 3678 3679 3680 |
# File 'time.c', line 3673
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]) ⇒ Time
Rounds subsecond to a given precision in decimal digits (0 digits by default). It returns a new Time object. ndigits
should be zero or a positive integer.
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 + 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
t = Time.utc(1999,12,31, 23,59,59) #=> 1999-12-31 23:59:59 UTC
(t + 0.123456789).round(4).iso8601(6) #=> 1999-12-31 23:59:59.1235 UTC
4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 |
# File 'time.c', line 4307
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
4687 4688 4689 4690 4691 |
# File 'time.c', line 4687
static VALUE
time_saturday(VALUE time)
{
wday_p(6);
}
|
#sec ⇒ Integer
Returns the second of the minute (0..60) for time.
Note: Seconds range from zero to 60 to allow the system to inject leap seconds. See en.wikipedia.org/wiki/Leap_second for further details.
t = Time.now #=> 2007-11-19 08:25:02 -0600
t.sec #=> 2
4435 4436 4437 4438 4439 4440 4441 4442 4443 |
# File 'time.c', line 4435
static VALUE
time_sec(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return INT2FIX(tobj->vtm.sec);
}
|
#strftime(string) ⇒ String
Formats time according to the directives in the given format string.
The directives begin with a percent (%) character. Any text not listed as a directive will be passed through to the output string.
The directive consists of a percent (%) character, zero or more flags, optional minimum field width, optional modifier and a conversion specifier as follows:
%<flags><width><modifier><conversion>
Flags:
- don't pad a numerical output
_ use spaces for padding
0 use zeros for padding
^ upcase the result string
# change case
: use colons for %z
The minimum field width specifies the minimum width.
The modifiers are “E” and “O”. They are ignored.
Format directives:
Date (Year, Month, Day):
%Y - Year with century if provided, will pad result at least 4 digits.
-0001, 0000, 1995, 2009, 14292, etc.
%C - year / 100 (rounded down such as 20 in 2009)
%y - year % 100 (00..99)
%m - Month of the year, zero-padded (01..12)
%_m blank-padded ( 1..12)
%-m no-padded (1..12)
%B - The full month name (``January'')
%^B uppercased (``JANUARY'')
%b - The abbreviated month name (``Jan'')
%^b uppercased (``JAN'')
%h - Equivalent to %b
%d - Day of the month, zero-padded (01..31)
%-d no-padded (1..31)
%e - Day of the month, blank-padded ( 1..31)
%j - Day of the year (001..366)
Time (Hour, Minute, Second, Subsecond):
%H - Hour of the day, 24-hour clock, zero-padded (00..23)
%k - Hour of the day, 24-hour clock, blank-padded ( 0..23)
%I - Hour of the day, 12-hour clock, zero-padded (01..12)
%l - Hour of the day, 12-hour clock, blank-padded ( 1..12)
%P - Meridian indicator, lowercase (``am'' or ``pm'')
%p - Meridian indicator, uppercase (``AM'' or ``PM'')
%M - Minute of the hour (00..59)
%S - Second of the minute (00..60)
%L - Millisecond of the second (000..999)
The digits under millisecond are truncated to not produce 1000.
%N - Fractional seconds digits, default is 9 digits (nanosecond)
%3N millisecond (3 digits)
%6N microsecond (6 digits)
%9N nanosecond (9 digits)
%12N picosecond (12 digits)
%15N femtosecond (15 digits)
%18N attosecond (18 digits)
%21N zeptosecond (21 digits)
%24N yoctosecond (24 digits)
The digits under the specified length are truncated to avoid
carry up.
Time zone:
%z - Time zone as hour and minute offset from UTC (e.g. +0900)
%:z - hour and minute offset from UTC with a colon (e.g. +09:00)
%::z - hour, minute and second offset from UTC (e.g. +09:00:00)
%Z - Abbreviated time zone name or similar information. (OS dependent)
Weekday:
%A - The full weekday name (``Sunday'')
%^A uppercased (``SUNDAY'')
%a - The abbreviated name (``Sun'')
%^a uppercased (``SUN'')
%u - Day of the week (Monday is 1, 1..7)
%w - Day of the week (Sunday is 0, 0..6)
ISO 8601 week-based year and week number:
The first week of YYYY starts with a Monday and includes YYYY-01-04.
The days in the year before the first week are in the last week of
the previous year.
%G - The week-based year
%g - The last 2 digits of the week-based year (00..99)
%V - Week number of the week-based year (01..53)
Week number:
The first week of YYYY that starts with a Sunday or Monday (according to %U
or %W). The days in the year before the first week are in week 0.
%U - Week number of the year. The week starts with Sunday. (00..53)
%W - Week number of the year. The week starts with Monday. (00..53)
Seconds since the Epoch:
%s - Number of seconds since 1970-01-01 00:00:00 UTC.
Literal string:
%n - Newline character (\n)
%t - Tab character (\t)
%% - Literal ``%'' character
Combination:
%c - date and time (%a %b %e %T %Y)
%D - Date (%m/%d/%y)
%F - The ISO 8601 date format (%Y-%m-%d)
%v - VMS date (%e-%^b-%4Y)
%x - Same as %D
%X - Same as %T
%r - 12-hour time (%I:%M:%S %p)
%R - 24-hour time (%H:%M)
%T - 24-hour time (%H:%M:%S)
This method is similar to strftime() function defined in ISO C and POSIX.
While all directives are locale independent since Ruby 1.9, %Z is platform dependent. So, the result may differ even if the same format string is used in other systems such as C.
%z is recommended over %Z. %Z doesn’t identify the timezone. For example, “CST” is used at America/Chicago (-06:00), America/Havana (-05:00), Asia/Harbin (+08:00), Australia/Darwin (+09:30) and Australia/Adelaide (+10:30). Also, %Z is highly dependent on the operating system. For example, it may generate a non ASCII string on Japanese Windows, i.e. the result can be different to “JST”. So the numeric time zone offset, %z, is recommended.
Examples:
t = Time.new(2007,11,19,8,37,48,"-06:00") #=> 2007-11-19 08:37:48 -0600
t.strftime("Printed on %m/%d/%Y") #=> "Printed on 11/19/2007"
t.strftime("at %I:%M %p") #=> "at 08:37 AM"
Various ISO 8601 formats:
%Y%m%d => 20071119 Calendar date (basic)
%F => 2007-11-19 Calendar date (extended)
%Y-%m => 2007-11 Calendar date, reduced accuracy, specific month
%Y => 2007 Calendar date, reduced accuracy, specific year
%C => 20 Calendar date, reduced accuracy, specific century
%Y%j => 2007323 Ordinal date (basic)
%Y-%j => 2007-323 Ordinal date (extended)
%GW%V%u => 2007W471 Week date (basic)
%G-W%V-%u => 2007-W47-1 Week date (extended)
%GW%V => 2007W47 Week date, reduced accuracy, specific week (basic)
%G-W%V => 2007-W47 Week date, reduced accuracy, specific week (extended)
%H%M%S => 083748 Local time (basic)
%T => 08:37:48 Local time (extended)
%H%M => 0837 Local time, reduced accuracy, specific minute (basic)
%H:%M => 08:37 Local time, reduced accuracy, specific minute (extended)
%H => 08 Local time, reduced accuracy, specific hour
%H%M%S,%L => 083748,000 Local time with decimal fraction, comma as decimal sign (basic)
%T,%L => 08:37:48,000 Local time with decimal fraction, comma as decimal sign (extended)
%H%M%S.%L => 083748.000 Local time with decimal fraction, full stop as decimal sign (basic)
%T.%L => 08:37:48.000 Local time with decimal fraction, full stop as decimal sign (extended)
%H%M%S%z => 083748-0600 Local time and the difference from UTC (basic)
%T%:z => 08:37:48-06:00 Local time and the difference from UTC (extended)
%Y%m%dT%H%M%S%z => 20071119T083748-0600 Date and time of day for calendar date (basic)
%FT%T%:z => 2007-11-19T08:37:48-06:00 Date and time of day for calendar date (extended)
%Y%jT%H%M%S%z => 2007323T083748-0600 Date and time of day for ordinal date (basic)
%Y-%jT%T%:z => 2007-323T08:37:48-06:00 Date and time of day for ordinal date (extended)
%GW%V%uT%H%M%S%z => 2007W471T083748-0600 Date and time of day for week date (basic)
%G-W%V-%uT%T%:z => 2007-W47-1T08:37:48-06:00 Date and time of day for week date (extended)
%Y%m%dT%H%M => 20071119T0837 Calendar date and local time (basic)
%FT%R => 2007-11-19T08:37 Calendar date and local time (extended)
%Y%jT%H%MZ => 2007323T0837Z Ordinal date and UTC of day (basic)
%Y-%jT%RZ => 2007-323T08:37Z Ordinal date and UTC of day (extended)
%GW%V%uT%H%M%z => 2007W471T0837-0600 Week date and local time and difference from UTC (basic)
%G-W%V-%uT%R%:z => 2007-W47-1T08:37-06:00 Week date and local time and difference from UTC (extended)
5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 |
# File 'time.c', line 5071
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
Returns the subsecond for time.
The return value can be a rational number.
t = Time.now #=> 2020-07-20 15:40:26.867462289 +0900
t.subsec #=> (867462289/1000000000)
t = Time.now #=> 2020-07-20 15:40:50.313828595 +0900
t.subsec #=> (62765719/200000000)
t = Time.new(2000,1,1,2,3,4) #=> 2000-01-01 02:03:04 +0900
t.subsec #=> 0
Time.new(2000,1,1,0,0,1/3r,"UTC").subsec #=> (1/3)
3703 3704 3705 3706 3707 3708 3709 3710 |
# File 'time.c', line 3703
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
4591 4592 4593 4594 4595 |
# File 'time.c', line 4591
static VALUE
time_sunday(VALUE time)
{
wday_p(0);
}
|
#thursday? ⇒ Boolean
4655 4656 4657 4658 4659 |
# File 'time.c', line 4655
static VALUE
time_thursday(VALUE time)
{
wday_p(4);
}
|
#to_a ⇒ Array
Returns a ten-element array of values for time:
[sec, min, hour, day, month, year, wday, yday, isdst, zone]
See the individual methods for an explanation of the valid ranges of each value. The ten elements can be passed directly to Time.utc or Time.local to create a new Time object.
t = Time.now #=> 2007-11-19 08:36:01 -0600
now = t.to_a #=> [1, 36, 8, 19, 11, 2007, 1, 323, false, "CST"]
4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 |
# File 'time.c', line 4833
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),
tobj->vtm.isdst?Qtrue:Qfalse,
time_zone(time));
}
|
#to_f ⇒ Float
Returns the value of time as a floating point number of seconds since the Epoch. The return value approximate the exact value in the Time object because floating point numbers cannot represent all rational numbers exactly.
t = Time.now #=> 2020-07-20 22:00:29.38740268 +0900
t.to_f #=> 1595250029.3874028
t.to_i #=> 1595250029
Note that IEEE 754 double is not accurate enough to represent the exact number of nanoseconds since the Epoch. (IEEE 754 double has 53bit mantissa. So it can represent exact number of nanoseconds only in ‘2 ** 53 / 1_000_000_000 / 60 / 60 / 24 = 104.2` days.) When Ruby uses a nanosecond-resolution clock function, such as clock_gettime
of POSIX, to obtain the current time, Time#to_f can lost information of a Time object created with Time.now
.
3583 3584 3585 3586 3587 3588 3589 3590 |
# File 'time.c', line 3583
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 #tv_sec ⇒ Integer
3550 3551 3552 3553 3554 3555 3556 3557 |
# File 'time.c', line 3550
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
3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 |
# File 'time.c', line 3606
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
Returns a string representing time. Equivalent to calling #strftime with the appropriate format string.
t = Time.now
t.to_s #=> "2012-11-10 18:16:12 +0100"
t.strftime "%Y-%m-%d %H:%M:%S %z" #=> "2012-11-10 18:16:12 +0100"
t.utc.to_s #=> "2012-11-10 17:16:12 UTC"
t.strftime "%Y-%m-%d %H:%M:%S UTC" #=> "2012-11-10 17:16:12 UTC"
4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 |
# File 'time.c', line 4128
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
4623 4624 4625 4626 4627 |
# File 'time.c', line 4623
static VALUE
time_tuesday(VALUE time)
{
wday_p(2);
}
|
#nsec ⇒ Integer #tv_nsec ⇒ Integer
Returns the number of nanoseconds for the subsecond part of time. The result is a non-negative integer less than 10**9.
t = Time.now #=> 2020-07-20 22:07:10.963933942 +0900
t.nsec #=> 963933942
If time has fraction of nanosecond (such as picoseconds), it is truncated.
t = Time.new(2000,1,1,0,0,0.666_777_888_999r)
t.nsec #=> 666777888
Time#subsec can be used to obtain the subsecond part exactly.
3673 3674 3675 3676 3677 3678 3679 3680 |
# File 'time.c', line 3673
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 #tv_sec ⇒ Integer
3550 3551 3552 3553 3554 3555 3556 3557 |
# File 'time.c', line 3550
static VALUE
time_to_i(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE)));
}
|
#usec ⇒ Integer #tv_usec ⇒ Integer
Returns the number of microseconds for the subsecond part of time. The result is a non-negative integer less than 10**6.
t = Time.now #=> 2020-07-20 22:05:58.459785953 +0900
t.usec #=> 459785
If time has fraction of microsecond (such as nanoseconds), it is truncated.
t = Time.new(2000,1,1,0,0,0.666_777_888_999r)
t.usec #=> 666777
Time#subsec can be used to obtain the subsecond part exactly.
3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 |
# File 'time.c', line 3640
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 #tv_usec ⇒ Integer
Returns the number of microseconds for the subsecond part of time. The result is a non-negative integer less than 10**6.
t = Time.now #=> 2020-07-20 22:05:58.459785953 +0900
t.usec #=> 459785
If time has fraction of microsecond (such as nanoseconds), it is truncated.
t = Time.new(2000,1,1,0,0,0.666_777_888_999r)
t.usec #=> 666777
Time#subsec can be used to obtain the subsecond part exactly.
3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 |
# File 'time.c', line 3640
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));
}
|
#gmtime ⇒ Time #utc ⇒ Time
3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 |
# File 'time.c', line 3948
static VALUE
time_gmtime(VALUE time)
{
struct time_object *tobj;
struct vtm vtm;
GetTimeval(time, tobj);
if (TZMODE_UTC_P(tobj)) {
if (tobj->tm_got)
return time;
}
else {
time_modify(time);
}
vtm.zone = str_utc;
GMTIMEW(tobj->timew, &vtm);
tobj->vtm = vtm;
tobj->tm_got = 1;
TZMODE_SET_UTC(tobj);
return time;
}
|
#utc? ⇒ Boolean #gmt? ⇒ Boolean
Returns true
if time represents a time in UTC (GMT).
t = Time.now #=> 2007-11-19 08:15:23 -0600
t.utc? #=> false
t = Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
t = Time.now #=> 2007-11-19 08:16:03 -0600
t.gmt? #=> false
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt? #=> true
3795 3796 3797 3798 3799 3800 3801 3802 3803 |
# File 'time.c', line 3795
static VALUE
time_utc_p(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
if (TZMODE_UTC_P(tobj)) return Qtrue;
return Qfalse;
}
|
#gmt_offset ⇒ Integer #gmtoff ⇒ Integer #utc_offset ⇒ Integer
4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 |
# File 'time.c', line 4800
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
4567 4568 4569 4570 4571 4572 4573 4574 4575 |
# File 'time.c', line 4567
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
4639 4640 4641 4642 4643 |
# File 'time.c', line 4639
static VALUE
time_wednesday(VALUE time)
{
wday_p(3);
}
|
#yday ⇒ Integer
4703 4704 4705 4706 4707 4708 4709 4710 4711 |
# File 'time.c', line 4703
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
4539 4540 4541 4542 4543 4544 4545 4546 4547 |
# File 'time.c', line 4539
static VALUE
time_year(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj);
MAKE_TM(time, tobj);
return tobj->vtm.year;
}
|
#zone ⇒ String
4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 |
# File 'time.c', line 4764
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;
}
|