Class: Time
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Instance Chain:
self,
::Comparable
|
|
Inherits: | Object |
Defined in: | timev.rb, time.c |
Overview
A Time object represents a date and time:
Time.new(2000, 1, 1, 0, 0, 0) # => 2000-01-01 00:00:00 -0600
Although its value can be expressed as a single numeric (see Epoch Seconds
below), it can be convenient to deal with the value by parts:
t = Time.new(-2000, 1, 1, 0, 0, 0.0)
# => -2000-01-01 00:00:00 -0600
t.year # => -2000
t.month # => 1
t.mday # => 1
t.hour # => 0
t.min # => 0
t.sec # => 0
t.subsec # => 0
t = Time.new(2000, 12, 31, 23, 59, 59.5)
# => 2000-12-31 23:59:59.5 -0600
t.year # => 2000
t.month # => 12
t.mday # => 31
t.hour # => 23
t.min # => 59
t.sec # => 59
t.subsec # => (1/2)
Epoch Seconds
Epoch seconds is the exact number of seconds (including fractional subseconds) since the Unix Epoch, January 1, 1970.
You can retrieve that value exactly using method #to_r:
Time.at(0).to_r # => (0/1)
Time.at(0.999999).to_r # => (9007190247541737/9007199254740992)
Other retrieval methods such as #to_i and #to_f may return a value that rounds or truncates subseconds.
Time Resolution
A Time object derived from the system clock (for example, by method .now) has the resolution supported by the system.
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 .new. This will use the current system time. .now is an alias for this. You can also pass parts of the time to .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:
zone = timezone("Europe/Athens") # Eastern European Time, UTC+2
Time.new(2002, 10, 31, 2, 2, 2, zone) #=> 2002-10-31 02:02:02 +0200
You can also use .local and .utc to infer local and UTC timezones instead of using the current system setting.
You can also create a new time using .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
What’s Here
First, what’s elsewhere. Class Time:
-
Inherits from
class Object
. -
Includes
module Comparable
.
Here, class Time provides methods that are useful for:
-
Creating \ objects
. -
Fetching \ values
. -
Querying a \ object
. -
Comparing \ objects
. -
Converting a \ object
. -
{Time@Methods+for+Rounding Rounding a }.
Methods for Creating
-
.new: Returns a new time from specified arguments (year, month, etc.), including an optional timezone value.
-
.local (aliased as .mktime): Same as .new, except the timezone is the local timezone.
-
.utc (aliased as .gm): Same as .new, except the timezone is UTC.
-
.at: Returns a new time based on seconds since epoch.
-
.now: Returns a new time based on the current system time.
-
#+ (plus): Returns a new time increased by the given number of seconds.
-
#- (minus): Returns a new time decreased by the given number of seconds.
Methods for Fetching
-
#year: Returns the year of the time.
-
#hour: Returns the hours value for the time.
-
#min: Returns the minutes value for the time.
-
#sec: Returns the seconds value for the time.
-
#usec (aliased as #tv_usec): Returns the number of microseconds in the subseconds value of the time.
-
#nsec (aliased as #tv_nsec: Returns the number of nanoseconds in the subsecond part of the time.
-
#subsec: Returns the subseconds value for the time.
-
#wday: Returns the integer weekday value of the time (0 == Sunday).
-
#yday: Returns the integer yearday value of the time (1 == January 1).
-
#hash: Returns the integer hash value for the time.
-
#utc_offset (aliased as #gmt_offset and #gmtoff): Returns the offset in seconds between time and UTC.
-
#to_f: Returns the float number of seconds since epoch for the time.
-
#to_i (aliased as #tv_sec): Returns the integer number of seconds since epoch for the time.
-
#to_r: Returns the
::Rational
number of seconds since epoch for the time. -
#zone: Returns a string representation of the timezone of the time.
Methods for Querying
-
#dst? (aliased as #isdst): Returns whether the time is DST (daylight saving time).
-
#sunday?: Returns whether the time is a Sunday.
-
#monday?: Returns whether the time is a Monday.
-
#tuesday?: Returns whether the time is a Tuesday.
-
#wednesday?: Returns whether the time is a Wednesday.
-
#thursday?: Returns whether the time is a Thursday.
-
#friday?: Returns whether time is a Friday.
-
#saturday?: Returns whether the time is a Saturday.
Methods for Comparing
Methods for Converting
-
#inspect: Returns the time in detail as a string.
-
#strftime: Returns the time as a string, according to a given format.
-
#to_a: Returns a 10-element array of values from the time.
-
#to_s: Returns a string representation of the time.
-
#getutc (aliased as #getgm): Returns a new time converted to UTC.
-
#getlocal: Returns a new time converted to local time.
-
#localtime: Converts time to local time in place.
-
#deconstruct_keys: Returns a hash of time components used in pattern-matching.
Methods for Rounding
-
#round:Returns a new time with subseconds rounded.
-
#ceil: Returns a new time with subseconds raised to a ceiling.
-
#floor: Returns a new time with subseconds lowered to a floor.
For the forms of argument #zone, see zone Specifiers
.
Class Method Summary
-
.at(time, subsec = false, unit = :microsecond, in: nil)
Returns a new Time object based on the given arguments.
-
.utc(year, month = 1, mday = 1, hour = 0, min = 0, sec = 0, usec = 0) ⇒ Time
(also: .utc)
Returns a new Time object based the on given arguments, in the UTC timezone.
-
.local(year, month = 1, mday = 1, hour = 0, min = 0, sec = 0, usec = 0) ⇒ Time
(also: .mktime)
Like .utc, except that the returned Time object has the local timezone, not the UTC timezone:
-
.local(year, month = 1, mday = 1, hour = 0, min = 0, sec = 0, usec = 0) ⇒ Time
Alias for .local.
-
.new(year = (now = true), mon = (str = year; nil), mday = nil, hour = nil, min = nil, sec = nil, zone = nil, in: nil, precision: 9) ⇒ Time
constructor
Returns a new Time object based on the given arguments, by default in the local timezone.
-
.now(in: nil)
Creates a new Time object from the current system time.
-
.utc(year, month = 1, mday = 1, hour = 0, min = 0, sec = 0, usec = 0) ⇒ Time
Alias for .gm.
Instance Attribute Summary
-
#dst? ⇒ Boolean
(also: #isdst)
readonly
Returns
true
ifself
is in daylight saving time,false
otherwise: -
#friday? ⇒ Boolean
readonly
Returns
true
ifself
represents a Friday,false
otherwise: -
#gmt? ⇒ Boolean
(also: #utc?)
readonly
Returns
true
ifself
represents a time in UTC (GMT): -
#isdst ⇒ Boolean
readonly
Alias for #dst?.
-
#monday? ⇒ Boolean
readonly
Returns
true
ifself
represents a Monday,false
otherwise: -
#saturday? ⇒ Boolean
readonly
Returns
true
ifself
represents a Saturday,false
otherwise: -
#sunday? ⇒ Boolean
readonly
Returns
true
ifself
represents a Sunday,false
otherwise: -
#thursday? ⇒ Boolean
readonly
Returns
true
ifself
represents a Thursday,false
otherwise: -
#tuesday? ⇒ Boolean
readonly
Returns
true
ifself
represents a Tuesday,false
otherwise: -
#utc? ⇒ Boolean
readonly
Alias for #gmt?.
-
#wednesday? ⇒ Boolean
readonly
Returns
true
ifself
represents a Wednesday,false
otherwise:
Instance Method Summary
-
#+(numeric) ⇒ Time
Returns a new Time object whose value is the sum of the numeric value of
self
and the givennumeric
: -
#-(numeric) ⇒ Time
When
numeric
is given, returns a new Time object whose value is the difference of the numeric value ofself
andnumeric
: -
#<=>(other_time) ⇒ 1, ...
Compares
self
withother_time
; returns: -
#asctime ⇒ String
Alias for #ctime.
-
#ceil(ndigits = 0) ⇒ Time
Returns a new Time object whose numerical value is greater than or equal to
self
with its seconds truncated to precisionndigits
: -
#ctime ⇒ String
(also: #asctime)
Returns a string representation of
self
, formatted bystrftime('%a %b %e %T %Y')
or its shorthand versionstrftime('%c')
; seeFormats for Dates and Times
: -
#day ⇒ Integer
(also: #mday)
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.
-
#eql?(other_time)
Returns
true
ifself
andother_time
are both Time objects with the exact same time value. -
#floor(ndigits = 0) ⇒ Time
Returns a new Time object whose numerical value is less than or equal to
self
with its seconds truncated to precisionndigits
: -
#getutc ⇒ Time
(also: #getutc)
Returns a new Time object representing the value of
self
converted to the UTC timezone: -
#getlocal(zone = nil) ⇒ Time
Returns a new Time object representing the value of
self
converted to a given timezone; if #zone isnil
, the local timezone is used: -
#getutc ⇒ Time
Alias for #getgm.
-
#gmt_offset ⇒ Integer
Alias for #gmtoff.
-
#gmtime ⇒ self
Alias for #utc.
-
#utc_offset ⇒ Integer
(also: #gmt_offset, #utc_offset)
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): -
#inspect ⇒ String
Returns a string representation of
self
with subseconds: -
#localtime ⇒ self, Time
With no argument given:
-
#mday ⇒ Integer
Alias for #day.
-
#min ⇒ Integer
Returns the integer minute of the hour for
self
, in range (0..59): -
#mon ⇒ Integer
(also: #month)
Returns the integer month of the year for
self
, in range (1..12): -
#month ⇒ Integer
Alias for #mon.
-
#nsec ⇒ Integer
(also: #tv_nsec)
Returns the number of nanoseconds in the subseconds part of
self
in the range (0..999_999_999); lower-order digits are truncated, not rounded: -
#round(ndigits = 0) ⇒ Time
Returns a new Time object whose numeric value is that of
self
, with its seconds value rounded to precisionndigits
: -
#sec ⇒ Integer
Returns the integer second of the minute for
self
, in range (0..60): -
#strftime(format_string) ⇒ String
Returns a string representation of
self
, formatted according to the given stringformat
. -
#subsec ⇒ Numeric
Returns the exact subseconds for
self
as a::Numeric
(Integer or::Rational
): -
#to_a ⇒ Array
Returns a 10-element array of values representing
self
: -
#to_f ⇒ Float
Returns the value of
self
as a::Float
numberEpoch seconds
; subseconds are included. -
#to_i ⇒ Integer
(also: #tv_sec)
Returns the value of
self
as integerEpoch seconds
; subseconds are truncated (not rounded): -
#to_r ⇒ Rational
Returns the value of
self
as a::Rational
exact number ofEpoch seconds
;. -
#to_s ⇒ String
Returns a string representation of
self
, without subseconds: -
#tv_nsec ⇒ Integer
Alias for #nsec.
-
#tv_sec ⇒ Integer
Alias for #to_i.
-
#tv_usec ⇒ Integer
Alias for #usec.
-
#usec ⇒ Integer
(also: #tv_usec)
Returns the number of microseconds in the subseconds part of
self
in the range (0..999_999); lower-order digits are truncated, not rounded: -
#utc ⇒ self
(also: #gmtime)
readonly
Returns
self
, converted to the UTC timezone: -
#utc_offset ⇒ Integer
Alias for #gmtoff.
-
#wday ⇒ Integer
Returns the integer day of the week for
self
, in range (0..6), with Sunday as zero. -
#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, Time
Returns the string name of the time zone for
self
: - #initialize_copy(time) Internal use only
- #_dump(*args) private Internal use only
- #_load(str) private Internal use only
- #marshal_dump private Internal use only
- #marshal_load(str) private Internal use only
::Comparable
- Included
#< | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value less than 0. |
#<= | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value less than or equal to 0. |
#== | Compares two objects based on the receiver’s #<=> method, returning true if it returns 0. |
#> | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value greater than 0. |
#>= | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value greater than or equal to 0. |
#between? | |
#clamp |
Constructor Details
.new(year = (now = true), mon = (str = year; nil), mday = nil, hour = nil, min = nil, sec = nil, zone = nil, in: nil, precision: 9) ⇒ Time
Returns a new Time object based on the given arguments, by default in the local timezone.
With no positional arguments, returns the value of .now:
Time.new # => 2021-04-24 17:27:46.0512465 -0500
With one string argument that represents a time, returns a new Time object based on the given argument, in the local timezone.
Time.new('2000-12-31 23:59:59.5') # => 2000-12-31 23:59:59.5 -0600
Time.new('2000-12-31 23:59:59.5 +0900') # => 2000-12-31 23:59:59.5 +0900
Time.new('2000-12-31 23:59:59.5', in: '+0900') # => 2000-12-31 23:59:59.5 +0900
Time.new('2000-12-31 23:59:59.5') # => 2000-12-31 23:59:59.5 -0600
Time.new('2000-12-31 23:59:59.56789', precision: 3) # => 2000-12-31 23:59:59.567 -0600
With one to six arguments, returns a new Time object based on the given arguments, in the local timezone.
Time.new(2000, 1, 2, 3, 4, 5) # => 2000-01-02 03:04:05 -0600
For the positional arguments (other than #zone):
-
#year: Year, with no range limits:
Time.new(999999999) # => 999999999-01-01 00:00:00 -0600 Time.new(-999999999) # => -999999999-01-01 00:00:00 -0600
-
#month: Month in range (1..12), or case-insensitive 3-letter month name:
Time.new(2000, 1) # => 2000-01-01 00:00:00 -0600 Time.new(2000, 12) # => 2000-12-01 00:00:00 -0600 Time.new(2000, 'jan') # => 2000-01-01 00:00:00 -0600 Time.new(2000, 'JAN') # => 2000-01-01 00:00:00 -0600
-
#mday: Month day in range(1..31):
Time.new(2000, 1, 1) # => 2000-01-01 00:00:00 -0600 Time.new(2000, 1, 31) # => 2000-01-31 00:00:00 -0600
-
#hour: Hour in range (0..23), or 24 if #min, #sec, and #usec are zero:
Time.new(2000, 1, 1, 0) # => 2000-01-01 00:00:00 -0600 Time.new(2000, 1, 1, 23) # => 2000-01-01 23:00:00 -0600 Time.new(2000, 1, 1, 24) # => 2000-01-02 00:00:00 -0600
-
#min: Minute in range (0..59):
Time.new(2000, 1, 1, 0, 0) # => 2000-01-01 00:00:00 -0600 Time.new(2000, 1, 1, 0, 59) # => 2000-01-01 00:59:00 -0600
-
#sec: Second in range (0…61):
Time.new(2000, 1, 1, 0, 0, 0) # => 2000-01-01 00:00:00 -0600 Time.new(2000, 1, 1, 0, 0, 59) # => 2000-01-01 00:00:59 -0600 Time.new(2000, 1, 1, 0, 0, 60) # => 2000-01-01 00:01:00 -0600
#sec may be Float or Rational.
Time.new(2000, 1, 1, 0, 0, 59.5) # => 2000-12-31 23:59:59.5 +0900 Time.new(2000, 1, 1, 0, 0, 59.7r) # => 2000-12-31 23:59:59.7 +0900
These values may be:
-
Integers, as above.
-
Numerics convertible to integers:
Time.new(Float(0.0), Rational(1, 1), 1.0, 0.0, 0.0, 0.0) # => 0000-01-01 00:00:00 -0600
-
String integers:
a = %w[0 1 1 0 0 0] # => ["0", "1", "1", "0", "0", "0"] Time.new(*a) # => 0000-01-01 00:00:00 -0600
When positional argument #zone or keyword argument in:
is given, the new Time object is in the specified timezone. For the forms of argument #zone, see Timezone Specifiers
:
Time.new(2000, 1, 1, 0, 0, 0, '+12:00')
# => 2000-01-01 00:00:00 +1200
Time.new(2000, 1, 1, 0, 0, 0, in: '-12:00')
# => 2000-01-01 00:00:00 -1200
Time.new(in: '-12:00')
# => 2022-08-23 08:49:26.1941467 -1200
-
precision
: maximum effective digits in sub-second part, default is 9. More digits will be truncated, as other operations of Time. Ignored unless the first argument is a string.
# File 'timev.rb', line 384
def initialize(year = (now = true), mon = (str = year; nil), mday = nil, hour = nil, min = nil, sec = nil, zone = nil, in: nil, precision: 9) if zone if Primitive.arg!(:in) raise ArgumentError, "timezone argument given as positional and keyword arguments" end else zone = Primitive.arg!(:in) end if now return Primitive.time_init_now(zone) end if str and Primitive.time_init_parse(str, zone, precision) return self end Primitive.time_init_args(year, mon, mday, hour, min, sec, zone) end
Class Method Details
.at(time, subsec = false, unit = :microsecond, in: nil)
Returns a new Time object based on the given arguments.
Required argument time
may be either of:
-
A Time object, whose value is the basis for the returned time; also influenced by optional keyword argument
in:
(see below). -
A numeric number of
Epoch seconds
for the returned time.
Examples:
t = Time.new(2000, 12, 31, 23, 59, 59) # => 2000-12-31 23:59:59 -0600
secs = t.to_i # => 978328799
Time.at(secs) # => 2000-12-31 23:59:59 -0600
Time.at(secs + 0.5) # => 2000-12-31 23:59:59.5 -0600
Time.at(1000000000) # => 2001-09-08 20:46:40 -0500
Time.at(0) # => 1969-12-31 18:00:00 -0600
Time.at(-1000000000) # => 1938-04-24 17:13:20 -0500
Optional numeric argument #subsec and optional symbol argument units
work together to specify subseconds for the returned time; argument units
specifies the units for #subsec:
-
:millisecond
: #subsec in milliseconds:Time.at(secs, 0, :millisecond) # => 2000-12-31 23:59:59 -0600 Time.at(secs, 500, :millisecond) # => 2000-12-31 23:59:59.5 -0600 Time.at(secs, 1000, :millisecond) # => 2001-01-01 00:00:00 -0600 Time.at(secs, -1000, :millisecond) # => 2000-12-31 23:59:58 -0600
-
:microsecond
or:usec
: #subsec in microseconds:Time.at(secs, 0, :microsecond) # => 2000-12-31 23:59:59 -0600 Time.at(secs, 500000, :microsecond) # => 2000-12-31 23:59:59.5 -0600 Time.at(secs, 1000000, :microsecond) # => 2001-01-01 00:00:00 -0600 Time.at(secs, -1000000, :microsecond) # => 2000-12-31 23:59:58 -0600
-
:nanosecond
or:nsec
: #subsec in nanoseconds:Time.at(secs, 0, :nanosecond) # => 2000-12-31 23:59:59 -0600 Time.at(secs, 500000000, :nanosecond) # => 2000-12-31 23:59:59.5 -0600 Time.at(secs, 1000000000, :nanosecond) # => 2001-01-01 00:00:00 -0600 Time.at(secs, -1000000000, :nanosecond) # => 2000-12-31 23:59:58 -0600
Optional keyword argument +in: zone
specifies the timezone for the returned time:
Time.at(secs, in: '+12:00') # => 2001-01-01 17:59:59 +1200
Time.at(secs, in: '-12:00') # => 2000-12-31 17:59:59 -1200
For the forms of argument #zone, see Timezone Specifiers
.
.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
Also known as: .utc
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 if #min, #sec, and #usec are zero:
Time.utc(2000, 1, 1, 0) # => 2000-01-01 00:00:00 UTC Time.utc(2000, 1, 1, 23) # => 2000-01-01 23:00:00 UTC Time.utc(2000, 1, 1, 24) # => 2000-01-02 00:00:00 UTC
-
#min: Minute in range (0..59):
Time.utc(2000, 1, 1, 0, 0) # => 2000-01-01 00:00:00 UTC Time.utc(2000, 1, 1, 0, 59) # => 2000-01-01 00:59:00 UTC
-
#sec: Second in range (0..59), or 60 if #usec is zero:
Time.utc(2000, 1, 1, 0, 0, 0) # => 2000-01-01 00:00:00 UTC Time.utc(2000, 1, 1, 0, 0, 59) # => 2000-01-01 00:00:59 UTC Time.utc(2000, 1, 1, 0, 0, 60) # => 2000-01-01 00:01:00 UTC
-
#usec: Microsecond in range (0..999999):
Time.utc(2000, 1, 1, 0, 0, 0, 0) # => 2000-01-01 00:00:00 UTC Time.utc(2000, 1, 1, 0, 0, 0, 999999) # => 2000-01-01 00:00:00.999999 UTC
The values may be:
-
Integers, as above.
-
Numerics convertible to integers:
Time.utc(Float(0.0), Rational(1, 1), 1.0, 0.0, 0.0, 0.0, 0.0) # => 0000-01-01 00:00:00 UTC
-
String integers:
a = %w[0 1 1 0 0 0 0 0] # => ["0", "1", "1", "0", "0", "0", "0", "0"] Time.utc(*a) # => 0000-01-01 00:00:00 UTC
When exactly ten arguments are given, the arguments are interpreted as in the second calling sequence above:
Time.utc(sec, min, hour, mday, month, year, dummy, dummy, dummy, dummy)
where the dummy
arguments are ignored:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Time.utc(*a) # => 0005-04-03 02:01:00 UTC
This form is useful for creating a Time object from a 10-element array returned by #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.
gm
is an alias for .utc.
Related: .local.
# File 'time.c', line 3656
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, 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
Also known as: .mktime
Time
.local(sec, min, hour, mday, month, year, dummy, dummy, dummy, dummy) ⇒ Time
Like .utc, except that the returned Time object has the local timezone, not the UTC timezone:
# With seven arguments.
Time.local(0, 1, 2, 3, 4, 5, 6)
# => 0000-01-02 03:04:05.000006 -0600
# With exactly ten arguments.
Time.local(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# => 0005-04-03 02:01:00 -0600
# File 'time.c', line 3682
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, 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
Time
.local(sec, min, hour, mday, month, year, dummy, dummy, dummy, dummy) ⇒ Time
Alias for .local.
.now(in: nil)
# File 'timev.rb', line 223
def self.now(in: nil) Primitive.time_s_now(Primitive.arg!(:in)) end
.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
Time
.utc(sec, min, hour, mday, month, year, dummy, dummy, dummy, dummy) ⇒ Time
Alias for .gm.
Instance Attribute Details
#dst? ⇒ Boolean
(readonly) Also known as: #isdst
Returns true
if self
is in daylight saving time, false
otherwise:
t = Time.local(2000, 1, 1) # => 2000-01-01 00:00:00 -0600
t.zone # => "Central Standard Time"
t.dst? # => false
t = Time.local(2000, 7, 1) # => 2000-07-01 00:00:00 -0500
t.zone # => "Central Daylight Time"
t.dst? # => true
#isdst is an alias for dst?
.
# File 'time.c', line 4927
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); }
#friday? ⇒ Boolean
(readonly)
Returns true
if self
represents a Friday, false
otherwise:
t = Time.utc(2000, 1, 7) # => 2000-01-07 00:00:00 UTC
t.friday? # => true
Related: #saturday?, #sunday?, #monday?.
# File 'time.c', line 4867
static VALUE time_friday(VALUE time) { wday_p(5); }
#gmt? ⇒ Boolean
(readonly) Also known as: #utc?
# File 'time.c', line 3939
static VALUE time_utc_p(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return RBOOL(TZMODE_UTC_P(tobj)); }
#dst? ⇒ Boolean
(readonly)
#isdst ⇒ Boolean
Boolean
(readonly)
#isdst ⇒ Boolean
Alias for #dst?.
#monday? ⇒ Boolean
(readonly)
Returns true
if self
represents a Monday, false
otherwise:
t = Time.utc(2000, 1, 3) # => 2000-01-03 00:00:00 UTC
t.monday? # => true
Related: #tuesday?, #wednesday?, #thursday?.
# File 'time.c', line 4795
static VALUE time_monday(VALUE time) { wday_p(1); }
#saturday? ⇒ Boolean
(readonly)
# File 'time.c', line 4885
static VALUE time_saturday(VALUE time) { wday_p(6); }
#sunday? ⇒ Boolean
(readonly)
Returns true
if self
represents a Sunday, false
otherwise:
t = Time.utc(2000, 1, 2) # => 2000-01-02 00:00:00 UTC
t.sunday? # => true
Related: #monday?, #tuesday?, #wednesday?.
# File 'time.c', line 4777
static VALUE time_sunday(VALUE time) { wday_p(0); }
#thursday? ⇒ Boolean
(readonly)
Returns true
if self
represents a Thursday, false
otherwise:
t = Time.utc(2000, 1, 6) # => 2000-01-06 00:00:00 UTC
t.thursday? # => true
Related: #friday?, #saturday?, #sunday?.
# File 'time.c', line 4849
static VALUE time_thursday(VALUE time) { wday_p(4); }
#tuesday? ⇒ Boolean
(readonly)
Returns true
if self
represents a Tuesday, false
otherwise:
t = Time.utc(2000, 1, 4) # => 2000-01-04 00:00:00 UTC
t.tuesday? # => true
Related: #wednesday?, #thursday?, #friday?.
# File 'time.c', line 4813
static VALUE time_tuesday(VALUE time) { wday_p(2); }
#gmt? ⇒ Boolean
(readonly)
#utc? ⇒ Boolean
Boolean
(readonly)
#utc? ⇒ Boolean
Alias for #gmt?.
#wednesday? ⇒ Boolean
(readonly)
Returns true
if self
represents a Wednesday, false
otherwise:
t = Time.utc(2000, 1, 5) # => 2000-01-05 00:00:00 UTC
t.wednesday? # => true
Related: #thursday?, #friday?, #saturday?.
# File 'time.c', line 4831
static VALUE time_wednesday(VALUE time) { wday_p(3); }
Instance Method Details
#+(numeric) ⇒ Time
# File 'time.c', line 4380
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
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
:
t - t # => 0.0
Related: #+.
# File 'time.c', line 4414
static VALUE time_minus(VALUE time1, VALUE time2) { struct time_object *tobj; GetTimeval(time1, tobj); if (IsTimeval(time2)) { struct time_object *tobj2; GetTimeval(time2, tobj2); return rb_Float(rb_time_unmagnify_to_float(wsub(tobj->timew, tobj2->timew))); } return time_add(tobj, time1, time2, -1); }
#<=>(other_time) ⇒ 1
, ...
Compares self
with other_time
; returns:
-
-1
, ifself
is less thanother_time
. -
0
, ifself
is equal toother_time
. -
1
, ifself
is greater thenother_time
. -
nil
, ifself
andother_time
are incomparable.
Examples:
t = Time.now # => 2007-11-19 08:12:12 -0600
t2 = t + 2592000 # => 2007-12-19 08:12:12 -0600
t <=> t2 # => -1
t2 <=> t # => 1
t = Time.now # => 2007-11-19 08:13:38 -0600
t2 = t + 0.1 # => 2007-11-19 08:13:38 -0600
t.nsec # => 98222999
t2.nsec # => 198222999
t <=> t2 # => -1
t2 <=> t # => 1
t <=> t # => 0
# File 'time.c', line 3881
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) (private)
# File 'time.c', line 5345
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) (private)
# File 'time.c', line 5531
static VALUE time_load(VALUE klass, VALUE str) { VALUE time = time_s_alloc(klass); time_mload(time, str); return time; }
Alias for #ctime.
#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
# File 'time.c', line 4565
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 Also known as: #asctime
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"
#asctime is an alias for ctime
.
t.inspect # => "2000-12-31 23:59:59.5 +000001"
t.to_s # => "2000-12-31 23:59:59 +0000"
# File 'time.c', line 4254
static VALUE time_asctime(VALUE time) { return strftimev("%a %b %e %T %Y", time, rb_usascii_encoding()); }
#day ⇒ Integer Also known as: #mday
# File 'time.c', line 4677
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
# File 'time.c', line 5069
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; }
#eql?(other_time)
Returns true
if self
and other_time
are both Time objects with the exact same time value.
# File 'time.c', line 3908
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
# File 'time.c', line 4520
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); }
#getutc ⇒ Time
Also known as: #getutc
# File 'time.c', line 4214
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
.
# File 'time.c', line 4166
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
#getutc ⇒ Time
Time
#getutc ⇒ Time
Alias for #getgm.
Alias for #gmtoff.
#utc ⇒ self
#gmtime ⇒ self
self
#gmtime ⇒ self
Alias for #utc.
#utc_offset ⇒ Integer Also known as: #gmt_offset, #utc_offset
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.
#gmt_offset and gmtoff
are aliases for #utc_offset.
# File 'time.c', line 4983
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.
# File 'time.c', line 3957
static VALUE time_hash(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return rb_hash(w2v(tobj->timew)); }
#hour ⇒ Integer
# File 'time.c', line 4651
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)
# File 'time.c', line 3967
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
# File 'time.c', line 4304
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; }
#localtime ⇒ self
, Time
#localtime(zone) ⇒ Time
self
, Time
#localtime(zone) ⇒ Time
With no argument given:
-
Returns
self
ifself
is a local time. -
Otherwise returns a new Time in the user’s local timezone:
t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC t.localtime # => 2000-01-01 14:15:01 -0600
With argument #zone given, returns the new Time object created by converting self
to the given time zone:
t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
t.localtime("-09:00") # => 2000-01-01 11:15:01 -0900
For forms of argument #zone, see Timezone Specifiers
.
# File 'time.c', line 4064
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 (private)
# File 'time.c', line 5203
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 Integer). */ 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) (private)
# File 'time.c', line 5379
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); } } unsigned int mon = ((int)(p >> 10) & 0xf); /* 0...12 */ if (mon >= 12) { mon -= 12; year = addv(year, LONG2FIX(1)); } vtm.year = year; vtm.mon = mon + 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); TZMODE_SET_LOCALTIME(tobj); tobj->vtm.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); }
Alias for #day.
#min ⇒ Integer
# File 'time.c', line 4627
static VALUE time_min(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.min); }
#mon ⇒ Integer Also known as: #month
# File 'time.c', line 4703
static VALUE time_mon(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.mon); }
Alias for #mon.
#nsec ⇒ Integer Also known as: #tv_nsec
# File 'time.c', line 3818
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
# File 'time.c', line 4472
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); }
#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.
# File 'time.c', line 4603
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
.
# File 'time.c', line 5166
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 exact subseconds for self
as a ::Numeric
(Integer or ::Rational
):
t = Time.now # => 2022-07-11 15:11:36.8490302 -0500
t.subsec # => (4245151/5000000)
If the subseconds is zero, returns integer zero:
t = Time.new(2000, 1, 1, 2, 3, 4) # => 2000-01-01 02:03:04 -0600
t.subsec # => 0
# File 'time.c', line 3844
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)); }
#to_a ⇒ Array
# File 'time.c', line 5014
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
# File 'time.c', line 3738
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 Also known as: #tv_sec
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
#tv_sec is an alias for to_i
.
# File 'time.c', line 3709
static VALUE time_to_i(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE))); }
#to_r ⇒ Rational
Returns the value of self
as a ::Rational
exact number of Epoch seconds
;
Time.now.to_r # => (16571402750320203/10000000)
# File 'time.c', line 3759
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
# File 'time.c', line 4276
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()); }
Alias for #nsec.
Alias for #to_i.
Alias for #usec.
#usec ⇒ Integer Also known as: #tv_usec
# File 'time.c', line 3789
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
(readonly) Also known as: #gmtime
# File 'time.c', line 4092
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); tobj->vtm = vtm; tobj->vtm.tm_got = 1; TZMODE_SET_UTC(tobj); return time; }
Alias for #gmtoff.
#wday ⇒ Integer
# File 'time.c', line 4751
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); }
#yday ⇒ Integer
# File 'time.c', line 4901
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
# File 'time.c', line 4726
static VALUE time_year(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return tobj->vtm.year; }
#zone ⇒ String, Time
# File 'time.c', line 4950
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; }