class Time
ATime 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 (seeEpoch 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 -0600t.year# => -2000t.month# => 1t.mday# => 1t.hour# => 0t.min# => 0t.sec# => 0t.subsec# => 0t =Time.new(2000,12,31,23,59,59.5)# => 2000-12-31 23:59:59.5 -0600t.year# => 2000t.month# => 12t.mday# => 31t.hour# => 23t.min# => 59t.sec# => 59t.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 methodTime.to_r:
Time.at(0).to_r# => (0/1)Time.at(0.999999).to_r# => (9007190247541737/9007199254740992)
Other retrieval methods such asTime#to_i andTime#to_f may return a value that rounds or truncates subseconds.
Time Resolution¶↑
ATime object derived from the system clock (for example, by methodTime.now) has the resolution supported by the system.
Time Internal Representation¶↑
Conceptually,Time class uses a rational value to represent the number of seconds fromEpoch, 1970-01-01 00:00:00 UTC. There are no boundary or resolution limitations. The value can be obtained usingTime#to_r.
TheTime class always uses the Gregorian calendar. I.e. the proleptic Gregorian calendar is used. Other calendars, such as Julian calendar, are not supported.
The implementation uses a signed 63 bit integer,Integer (Bignum) object or Ratoinal object to represent a rational value. (The signed 63 bit integer is used regardless of 32 and 64 bit environments.) The value represents the number of nanoseconds fromEpoch. The signed 63 bit integer can represent 1823-11-12 to 2116-02-20. WhenInteger orRational object is used (before 1823, after 2116, under nanosecond),Time works slower than when the signed 63 bit integer is used.
Ruby uses the C functionlocaltime andgmtime to map between the number and 6-tuple (year,month,day,hour,minute,second).localtime is used for local time andgmtime is used for UTC.
Integer andRational has no range limit, but the localtime and gmtime has range limits due to the C typestime_t andstruct tm. If that limit is exceeded, Ruby extrapolates the localtime function.
time_t can represent 1901-12-14 to 2038-01-19 if it is 32 bit signed integer, -292277022657-01-27 to 292277026596-12-05 if it is 64 bit signed integer. Howeverlocaltime on some platforms doesn’t supports negativetime_t (before 1970).
struct tm hastm_year member to represent years. (tm_year = 0 means the year 1900.) It is defined asint in the C standard.tm_year can represent years between -2147481748 to 2147485547 ifint is 32 bit.
Ruby supports leap seconds as far as if the C functionlocaltime andgmtime supports it. They use the tz database in most Unix systems. The tz database has timezones which supports leap seconds. For example, “Asia/Tokyo” doesn’t support leap seconds but “right/Asia/Tokyo” supports leap seconds. So, Ruby supports leap seconds if the TZ environment variable is set to “right/Asia/Tokyo” in most Unix systems.
Examples¶↑
All of these examples were done using the EST timezone which is GMT-5.
Creating a NewTime Instance¶↑
You can create a new instance ofTime withTime.new. This will use the current system time.Time.now is an alias for this. You can also pass parts of the time toTime.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 -0500Time.new(2002,10)#=> 2002-10-01 00:00:00 -0500Time.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
zone =timezone("Europe/Athens")# Eastern European Time, UTC+2Time.new(2002,10,31,2,2,2,zone)#=> 2002-10-31 02:02:02 +0200
You can also useTime.local andTime.utc to infer local and UTC timezones instead of using the current system setting.
You can also create a new time usingTime.at which takes the number of seconds (with subsecond) since theUnix Epoch.
Time.at(628232400)#=> 1989-11-28 00:00:00 -0500
Working with an Instance ofTime¶↑
Once you have an instance ofTime 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#=> falset1==t1#=> truet1<t2#=> truet1>t2#=> falseTime.new(2010,10,31).between?(t1,t2)#=> true
What’s Here¶↑
First, what’s elsewhere. ClassTime:
Inherits fromclass Object.
Includesmodule Comparable.
Here, classTime provides methods that are useful for:
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 astv_usec): Returns the number of microseconds in the subseconds value of the time.nsec(aliased astv_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 asgmt_offsetandgmtoff): 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 astv_sec): Returns the integer number of seconds since epoch for the time.to_r: Returns theRationalnumber of seconds since epoch for the time.zone: Returns a string representation of the timezone of the time.
Methods for Querying¶↑
dst?(aliased asisdst): 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 asgetgm): 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 argumentzone, seeTimezone Specifiers.
Timezone Specifiers¶↑
CertainTime methods accept arguments that specify timezones:
Time.at: keyword argumentin:.Time.new: positional argumentzoneor keyword argumentin:.Time.now: keyword argumentin:.Time#getlocal: positional argumentzone.Time#localtime: positional argumentzone.
The value given with any of these must be one of the following (each detailed below):
Hours/Minutes Offsets¶↑
The zone value may be a string offset from UTC in the form'+HH:MM' or'-HH:MM', where:
HHis the 2-digit hour in the range0..23.MMis the 2-digit minute in the range0..59.
Examples:
t =Time.utc(2000,1,1,20,15,1)# => 2000-01-01 20:15:01 UTCTime.at(t,in:'-23:59')# => 1999-12-31 20:16:01 -2359Time.at(t,in:'+23:59')# => 2000-01-02 20:14:01 +2359
Single-Letter Offsets¶↑
The zone value may be a letter in the range'A'..'I' or'K'..'Z'; seeList of military time zones:
t =Time.utc(2000,1,1,20,15,1)# => 2000-01-01 20:15:01 UTCTime.at(t,in:'A')# => 2000-01-01 21:15:01 +0100Time.at(t,in:'I')# => 2000-01-02 05:15:01 +0900Time.at(t,in:'K')# => 2000-01-02 06:15:01 +1000Time.at(t,in:'Y')# => 2000-01-01 08:15:01 -1200Time.at(t,in:'Z')# => 2000-01-01 20:15:01 UTC
Integer Offsets¶↑
The zone value may be an integer number of seconds in the range-86399..86399:
t =Time.utc(2000,1,1,20,15,1)# => 2000-01-01 20:15:01 UTCTime.at(t,in:-86399)# => 1999-12-31 20:15:02 -235959Time.at(t,in:86399)# => 2000-01-02 20:15:00 +235959
Timezone Objects¶↑
The zone value may be an object responding to certain timezone methods, an instance ofTimezone andTZInfo for example.
The timezone methods are:
local_to_utc:Called when
Time.newis invoked withtzas the value of positional argumentzoneor keyword argumentin:.- Argument
- Returns
aTime-like object in the UTC timezone.
utc_to_local:Called when
Time.atorTime.nowis invoked withtzas the value for keyword argumentin:, and whenTime#getlocalorTime#localtimeis called withtzas the value for positional argumentzone.The UTC offset will be calculated as the difference between the original time and the returned object as an
Integer. If the object is in fixed offset, itsutc_offsetis also counted.- Argument
- Returns
aTime-like object in the local timezone.
A custom timezone class may have these instance methods, which will be called if defined:
abbr:Called when
Time#strftimeis invoked with a format involving%Z.- Argument
- Returns
a string abbreviation for the timezone name.
dst?:Called when
Time.atorTime.nowis invoked withtzas the value for keyword argumentin:, and whenTime#getlocalorTime#localtimeis called withtzas the value for positional argumentzone.- Argument
- Returns
whether the time is daylight saving time.
name:Called when
Marshal.dump(t)is invoked- Argument
none.
- Returns
the string name of the timezone.
Time-Like Objects¶↑
ATime-like object is a container object capable of interfacing with timezone libraries for timezone conversion.
The argument to the timezone conversion methods above will have attributes similar toTime, except that timezone related attributes are meaningless.
The objects returned bylocal_to_utc andutc_to_local methods of the timezone object may be of the same class as their arguments, of arbitrary object classes, or of classInteger.
For a returned class other thanInteger, the class must have the following methods:
yearmonmdayhourminsecisdst
For a returnedInteger, its components, decomposed in UTC, are interpreted as times in the specified timezone.
Timezone Names¶↑
If the class (the receiver of class methods, or the class of the receiver of instance methods) hasfind_timezone singleton method, this method is called to achieve the corresponding timezone object from a timezone name.
For example, usingTimezone:
classTimeWithTimezone<Timerequire'timezone'defself.find_timezone(z) =Timezone[z]endTimeWithTimezone.now(in:"America/New_York")#=> 2023-12-25 00:00:00 -0500TimeWithTimezone.new("2023-12-25 America/New_York")#=> 2023-12-25 00:00:00 -0500
Or, usingTZInfo:
classTimeWithTZInfo<Timerequire'tzinfo'defself.find_timezone(z) =TZInfo::Timezone.get(z)endTimeWithTZInfo.now(in:"America/New_York")#=> 2023-12-25 00:00:00 -0500TimeWithTZInfo.new("2023-12-25 America/New_York")#=> 2023-12-25 00:00:00 -0500
You can define this method per subclasses, or on the toplevelTime class.
Public Class Methods
Source
# File timev.rb, line 329defself.at(time,subsec =false,unit =:microsecond,in:nil)ifPrimitive.mandatory_only?Primitive.time_s_at1(time)elsePrimitive.time_s_at(time,subsec,unit,Primitive.arg!(:in))endend
Returns a newTime object based on the given arguments.
Required argumenttime may be either of:
A
Timeobject, whose value is the basis for the returned time; also influenced by optional keyword argumentin:(see below).A numeric number ofEpoch seconds for the returned time.
Examples:
t =Time.new(2000,12,31,23,59,59)# => 2000-12-31 23:59:59 -0600secs =t.to_i# => 978328799Time.at(secs)# => 2000-12-31 23:59:59 -0600Time.at(secs+0.5)# => 2000-12-31 23:59:59.5 -0600Time.at(1000000000)# => 2001-09-08 20:46:40 -0500Time.at(0)# => 1969-12-31 18:00:00 -0600Time.at(-1000000000)# => 1938-04-24 17:13:20 -0500
Optional numeric argumentsubsec and optional symbol argumentunits work together to specify subseconds for the returned time; argumentunits specifies the units forsubsec:
:millisecond:subsecin milliseconds:Time.at(secs,0,:millisecond)# => 2000-12-31 23:59:59 -0600Time.at(secs,500,:millisecond)# => 2000-12-31 23:59:59.5 -0600Time.at(secs,1000,:millisecond)# => 2001-01-01 00:00:00 -0600Time.at(secs,-1000,:millisecond)# => 2000-12-31 23:59:58 -0600
:microsecondor:usec:subsecin microseconds:Time.at(secs,0,:microsecond)# => 2000-12-31 23:59:59 -0600Time.at(secs,500000,:microsecond)# => 2000-12-31 23:59:59.5 -0600Time.at(secs,1000000,:microsecond)# => 2001-01-01 00:00:00 -0600Time.at(secs,-1000000,:microsecond)# => 2000-12-31 23:59:58 -0600
:nanosecondor:nsec:subsecin nanoseconds:Time.at(secs,0,:nanosecond)# => 2000-12-31 23:59:59 -0600Time.at(secs,500000000,:nanosecond)# => 2000-12-31 23:59:59.5 -0600Time.at(secs,1000000000,:nanosecond)# => 2001-01-01 00:00:00 -0600Time.at(secs,-1000000000,:nanosecond)# => 2000-12-31 23:59:58 -0600
Optional keyword argumentin: zone specifies the timezone for the returned time:
Time.at(secs,in:'+12:00')# => 2001-01-01 17:59:59 +1200Time.at(secs,in:'-12:00')# => 2000-12-31 17:59:59 -1200
For the forms of argumentzone, seeTimezone Specifiers.
Source
# File lib/time.rb, line 569defhttpdate(date)ifdate.match?(/\A\s* (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\x20 (\d{2})\x20 (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20 (\d{4})\x20 (\d{2}):(\d{2}):(\d{2})\x20 GMT \s*\z/ix)self.rfc2822(date).utcelsif/\A\s* (?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday),\x20 (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d)\x20 (\d\d):(\d\d):(\d\d)\x20 GMT \s*\z/ix=~dateyear =$3.to_iifyear<50year+=2000elseyear+=1900endself.utc(year,$2,$1.to_i,$4.to_i,$5.to_i,$6.to_i)elsif/\A\s* (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\x20 (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20 (\d\d|\x20\d)\x20 (\d\d):(\d\d):(\d\d)\x20 (\d{4}) \s*\z/ix=~dateself.utc($6.to_i,MonthValue[$1.upcase],$2.to_i,$3.to_i,$4.to_i,$5.to_i)elseraiseArgumentError.new("not RFC 2616 compliant date: #{date.inspect}")endend
Parsesdate as an HTTP-date defined by RFC 2616 and converts it to aTime object.
ArgumentError is raised ifdate is not compliant with RFC 2616 or if theTime class cannot represent specified date.
Seehttpdate for more information on this format.
require'time'Time.httpdate("Thu, 06 Oct 2011 02:26:12 GMT")#=> 2011-10-06 02:26:12 UTC
You must require ‘time’ to use this method.
Source
# File ext/json/lib/json/add/time.rb, line 9defself.json_create(object)ifusec =object.delete('u')# used to be tv_usec -> tv_nsecobject['n'] =usec*1000endat(object['s'],Rational(object['n'],1000))end
Seeas_json.
Source
static VALUEtime_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)));}LikeTime.utc, except that the returnedTime 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
Source
# File timev.rb, line 440definitialize(year = (now =true),mon = (str =year;nil),mday =nil,hour =nil,min =nil,sec =nil,zone =nil,in:nil,precision:9)ifzoneifPrimitive.arg!(:in)raiseArgumentError,"timezone argument given as positional and keyword arguments"endelsezone =Primitive.arg!(:in)endifnowreturnPrimitive.time_init_now(zone)endifstrandPrimitive.time_init_parse(str,zone,precision)returnselfendPrimitive.time_init_args(year,mon,mday,hour,min,sec,zone)end
Returns a newTime object based on the given arguments, by default in the local timezone.
With no positional arguments, returns the value ofTime.now:
Time.new# => 2021-04-24 17:27:46.0512465 -0500
With one string argument that represents a time, returns a newTime 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 -0600Time.new('2000-12-31 23:59:59.5 +0900')# => 2000-12-31 23:59:59.5 +0900Time.new('2000-12-31 23:59:59.5',in:'+0900')# => 2000-12-31 23:59:59.5 +0900Time.new('2000-12-31 23:59:59.5')# => 2000-12-31 23:59:59.5 -0600Time.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 newTime 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 thanzone):
year: Year, with no range limits:Time.new(999999999)# => 999999999-01-01 00:00:00 -0600Time.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 -0600Time.new(2000,12)# => 2000-12-01 00:00:00 -0600Time.new(2000,'jan')# => 2000-01-01 00:00:00 -0600Time.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 -0600Time.new(2000,1,31)# => 2000-01-31 00:00:00 -0600
hour: Hour in range (0..23), or 24 ifmin,sec, andusecare zero:Time.new(2000,1,1,0)# => 2000-01-01 00:00:00 -0600Time.new(2000,1,1,23)# => 2000-01-01 23:00:00 -0600Time.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 -0600Time.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 -0600Time.new(2000,1,1,0,0,59)# => 2000-01-01 00:00:59 -0600Time.new(2000,1,1,0,0,60)# => 2000-01-01 00:01:00 -0600
Time.new(2000,1,1,0,0,59.5)# => 2000-12-31 23:59:59.5 +0900Time.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
Stringintegers: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 argumentzone or keyword argumentin: is given, the newTime object is in the specified timezone. For the forms of argumentzone, seeTimezone Specifiers:
Time.new(2000,1,1,0,0,0,'+12:00')# => 2000-01-01 00:00:00 +1200Time.new(2000,1,1,0,0,0,in:'-12:00')# => 2000-01-01 00:00:00 -1200Time.new(in:'-12:00')# => 2022-08-23 08:49:26.1941467 -1200
Sincein: keyword argument just provides the default, so if the first argument in single string form contains time zone information, this keyword argument will be silently ignored.
Time.new('2000-01-01 00:00:00 +0100',in:'-0500').utc_offset# => 3600
precision: maximum effective digits in sub-second part, default is 9. More digits will be truncated, as other operations ofTime. Ignored unless the first argument is a string.
Source
# File timev.rb, line 270defself.now(in:nil)Primitive.time_s_now(Primitive.arg!(:in))end
Creates a newTime object from the current system time. This is the same asTime.new without arguments.
Time.now# => 2009-06-24 12:39:54 +0900Time.now(in:'+04:00')# => 2009-06-24 07:39:54 +0400
For forms of argumentzone, seeTimezone Specifiers.
Source
# File lib/time.rb, line 382defparse(date,now=self.now)comp =!block_given?d =Date._parse(date,comp)year =d[:year]year =yield(year)ifyear&&!compmake_time(date,year,d[:yday],d[:mon],d[:mday],d[:hour],d[:min],d[:sec],d[:sec_fraction],d[:zone],now)end
Takes a string representation of aTime and attempts to parse it using a heuristic.
This method **does not** function as a validator. If the input string does not match valid formats strictly, you may get a cryptic result. Should consider to useTime.strptime instead of this method as possible.
require'time'Time.parse("2010-10-31")#=> 2010-10-31 00:00:00 -0500
Any missing pieces of the date are inferred based on the current date.
require'time'# assuming the current date is "2011-10-31"Time.parse("12:00")#=> 2011-10-31 12:00:00 -0500
We can change the date used to infer our missing elements by passing a second object that responds tomon,day andyear, such asDate,Time orDateTime. We can also use our own object.
require'time'classMyDateattr_reader:mon,:day,:yeardefinitialize(mon,day,year)@mon,@day,@year =mon,day,yearendendd =Date.parse("2010-10-28")t =Time.parse("2010-10-29")dt =DateTime.parse("2010-10-30")md =MyDate.new(10,31,2010)Time.parse("12:00",d)#=> 2010-10-28 12:00:00 -0500Time.parse("12:00",t)#=> 2010-10-29 12:00:00 -0500Time.parse("12:00",dt)#=> 2010-10-30 12:00:00 -0500Time.parse("12:00",md)#=> 2010-10-31 12:00:00 -0500
If a block is given, the year described indate is converted by the block. This is specifically designed for handling two digit years. For example, if you wanted to treat all two digit years prior to 70 as the year 2000+ you could write this:
require'time'Time.parse("01-10-31") {|year|year+ (year<70?2000:1900)}#=> 2001-10-31 00:00:00 -0500Time.parse("70-10-31") {|year|year+ (year<70?2000:1900)}#=> 1970-10-31 00:00:00 -0500
If the upper components of the given time are broken or missing, they are supplied with those ofnow. For the lower components, the minimum values (1 or 0) are assumed if broken or missing. For example:
require'time'# Suppose it is "Thu Nov 29 14:33:20 2001" now and# your time zone is EST which is GMT-5.now =Time.parse("Thu Nov 29 14:33:20 2001")Time.parse("16:30",now)#=> 2001-11-29 16:30:00 -0500Time.parse("7/23",now)#=> 2001-07-23 00:00:00 -0500Time.parse("Aug 31",now)#=> 2001-08-31 00:00:00 -0500Time.parse("Aug 2000",now)#=> 2000-08-01 00:00:00 -0500
Since there are numerous conflicts among locally defined time zone abbreviations all over the world, this method is not intended to understand all of them. For example, the abbreviation “CST” is used variously as:
-06:00 in America/Chicago,-05:00 in America/Havana,+08:00 in Asia/Harbin,+09:30 in Australia/Darwin,+10:30 in Australia/Adelaide,etc.
Based on this fact, this method only understands the time zone abbreviations described in RFC 822 and the system time zone, in the order named. (i.e. a definition in RFC 822 overrides the system time zone definition.) The system time zone is taken fromTime.local(year, 1, 1).zone andTime.local(year, 7, 1).zone. If the extracted time zone abbreviation does not match any of them, it is ignored and the given time is regarded as a local time.
ArgumentError is raised ifDate._parse cannot extract information fromdate or if theTime class cannot represent specified date.
This method can be used as a fail-safe for other parsing methods as:
Time.rfc2822(date)rescueTime.parse(date)Time.httpdate(date)rescueTime.parse(date)Time.xmlschema(date)rescueTime.parse(date)
A failure ofTime.parse should be checked, though.
You must require ‘time’ to use this method.
Source
# File lib/time.rb, line 511defrfc2822(date)if/\A\s* (?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*,\s*)? (\d{1,2})\s+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+ (\d{2,})\s+ (\d{2})\s* :\s*(\d{2}) (?:\s*:\s*(\d\d))?\s+ ([+-]\d{4}| UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])/ix=~date# Since RFC 2822 permit comments, the regexp has no right anchor.day =$1.to_imon =MonthValue[$2.upcase]year =$3.to_ishort_year_p =$3.length<=3hour =$4.to_imin =$5.to_isec =$6?$6.to_i:0zone =$7ifshort_year_p# following year completion is compliant with RFC 2822.year =ifyear<502000+yearelse1900+yearendendoff =zone_offset(zone)year,mon,day,hour,min,sec =apply_offset(year,mon,day,hour,min,sec,off)t =self.utc(year,mon,day,hour,min,sec)force_zone!(t,zone,off)telseraiseArgumentError.new("not RFC 2822 compliant date: #{date.inspect}")endend
Parsesdate as date-time defined by RFC 2822 and converts it to aTime object. The format is identical to the date format defined by RFC 822 and updated by RFC 1123.
ArgumentError is raised ifdate is not compliant with RFC 2822 or if theTime class cannot represent specified date.
Seerfc2822 for more information on this format.
require'time'Time.rfc2822("Wed, 05 Oct 2011 22:26:12 -0400")#=> 2010-10-05 22:26:12 -0400
You must require ‘time’ to use this method.
Source
# File lib/time.rb, line 459defstrptime(date,format,now=self.now)d =Date._strptime(date,format)raiseArgumentError,"invalid date or strptime format - '#{date}' '#{format}'"unlessdifseconds =d[:seconds]ifsec_fraction =d[:sec_fraction]usec =sec_fraction*1000000usec*=-1ifseconds<0elseusec =0endt =Time.at(seconds,usec)ifzone =d[:zone]force_zone!(t,zone)endelseyear =d[:year]year =yield(year)ifyear&&block_given?yday =d[:yday]if (d[:cwyear]&&!year)|| ((d[:cwday]||d[:cweek])&&!(d[:mon]&&d[:mday]))# make_time doesn't deal with cwyear/cwday/cweekreturnDate.strptime(date,format).to_timeendif (d[:wnum0]||d[:wnum1])&&!yday&&!(d[:mon]&&d[:mday])yday =Date.strptime(date,format).ydayendt =make_time(date,year,yday,d[:mon],d[:mday],d[:hour],d[:min],d[:sec],d[:sec_fraction],d[:zone],now)endtend
Works similar toparse except that instead of using a heuristic to detect the format of the input string, you provide a second argument that describes the format of the string.
RaisesArgumentError if the date or format is invalid.
If a block is given, the year described indate is converted by the block. For example:
Time.strptime(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}Below is a list of the formatting options:
- %a
The abbreviated weekday name (“Sun”)
- %A
The full weekday name (“Sunday”)
- %b
The abbreviated month name (“Jan”)
- %B
The full month name (“January”)
- %c
The preferred local date and time representation
- %C
Century (20 in 2009)
- %d
Day of the month (01..31)
- %D
Date (%m/%d/%y)
- %e
Day of the month, blank-padded ( 1..31)
- %F
Equivalent to %Y-%m-%d (the ISO 8601 date format)
- %g
The last two digits of the commercial year
- %G
The week-based year according to ISO-8601 (week 1 starts on Monday and includes January 4)
- %h
Equivalent to %b
- %H
Hour of the day, 24-hour clock (00..23)
- %I
Hour of the day, 12-hour clock (01..12)
- %j
Day of the year (001..366)
- %k
hour, 24-hour clock, blank-padded ( 0..23)
- %l
hour, 12-hour clock, blank-padded ( 0..12)
- %L
Millisecond of the second (000..999)
- %m
Month of the year (01..12)
- %M
Minute of the hour (00..59)
- %n
Newline (n)
- %N
Fractional seconds digits
- %p
Meridian indicator (“AM” or “PM”)
- %P
Meridian indicator (“am” or “pm”)
- %r
time, 12-hour (same as %I:%M:%S %p)
- %R
time, 24-hour (%H:%M)
- %s
Number of seconds since 1970-01-01 00:00:00 UTC.
- %S
Second of the minute (00..60)
- %t
Tab character (t)
- %T
time, 24-hour (%H:%M:%S)
- %u
Day of the week as a decimal, Monday being 1. (1..7)
- %U
Week number of the current year, starting with the first Sunday as the first day of the first week (00..53)
- %v
VMS date (%e-%b-%Y)
- %V
Week number of year according to ISO 8601 (01..53)
- %W
Week number of the current year, starting with the first Monday as the first day of the first week (00..53)
- %w
Day of the week (Sunday is 0, 0..6)
- %x
Preferred representation for the date alone, no time
- %X
Preferred representation for the time alone, no date
- %y
Year without a century (00..99)
- %Y
Year which may include century, if provided
- %z
Time zone as hour offset from UTC (e.g. +0900)
- %Z
Time zone name
- %%
Literal “%” character
- %+
date(1) (%a %b %e %H:%M:%S %Z %Y)
require'time'Time.strptime("2000-10-31","%Y-%m-%d")#=> 2000-10-31 00:00:00 -0500
You must require ‘time’ to use this method.
Source
static VALUEtime_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)));}Returns a newTime 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 UTCTime.utc(-2000)# => -2000-01-01 00:00:00 UTC
There are no minimum and maximum values for the required argumentyear.
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 UTCTime.utc(2000,12)# => 2000-12-01 00:00:00 UTCTime.utc(2000,'jan')# => 2000-01-01 00:00:00 UTCTime.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 UTCTime.utc(2000,1,31)# => 2000-01-31 00:00:00 UTC
hour: Hour in range (0..23), or 24 ifmin,sec, andusecare zero:Time.utc(2000,1,1,0)# => 2000-01-01 00:00:00 UTCTime.utc(2000,1,1,23)# => 2000-01-01 23:00:00 UTCTime.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 UTCTime.utc(2000,1,1,0,59)# => 2000-01-01 00:59:00 UTC
sec: Second in range (0..59), or 60 ifusecis zero:Time.utc(2000,1,1,0,0,0)# => 2000-01-01 00:00:00 UTCTime.utc(2000,1,1,0,0,59)# => 2000-01-01 00:00:59 UTCTime.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 UTCTime.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
Stringintegers: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 thedummy 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 aTime object from a 10-element array returned byTime.to_a:
t =Time.new(2000,1,2,3,4,5,6)# => 2000-01-02 03:04:05 +000006a =t.to_a# => [5, 4, 3, 2, 1, 2000, 0, 2, false, nil]Time.utc(*a)# => 2000-01-02 03:04:05 UTC
The two forms have their first six arguments in common, though in different orders; the ranges of these common arguments are the same for both forms; see above.
Raises an exception if the number of arguments is eight, nine, or greater than ten.
Related:Time.local.
Source
# File lib/time.rb, line 623defxmlschema(time)if/\A\s* (-?\d+)-(\d\d)-(\d\d) T (\d\d):(\d\d):(\d\d) (\.\d+)? (Z|[+-]\d\d(?::?\d\d)?)? \s*\z/ix=~timeyear =$1.to_imon =$2.to_iday =$3.to_ihour =$4.to_imin =$5.to_isec =$6.to_iusec =0if$7usec =Rational($7)*1000000endif$8zone =$8off =zone_offset(zone)year,mon,day,hour,min,sec =apply_offset(year,mon,day,hour,min,sec,off)t =self.utc(year,mon,day,hour,min,sec,usec)force_zone!(t,zone,off)telseself.local(year,mon,day,hour,min,sec,usec)endelseraiseArgumentError.new("invalid xmlschema format: #{time.inspect}")endend
Parsestime as a dateTime defined by the XML Schema and converts it to aTime object. The format is a restricted version of the format defined by ISO 8601.
ArgumentError is raised iftime is not compliant with the format or if theTime class cannot represent the specified time.
Seexmlschema for more information on this format.
require'time'Time.xmlschema("2011-10-05T22:26:12-04:00")#=> 2011-10-05 22:26:12-04:00
You must require ‘time’ to use this method.
Source
# File lib/time.rb, line 83defzone_offset(zone,year=self.now.year)off =nilzone =zone.upcaseif/\A([+-])(\d\d)(:?)(\d\d)(?:\3(\d\d))?\z/=~zoneoff = ($1=='-'?-1:1)* (($2.to_i*60+$4.to_i)*60+$5.to_i)elsifzone.match?(/\A[+-]\d\d\z/)off =zone.to_i*3600elsifZoneOffset.include?(zone)off =ZoneOffset[zone]*3600elsif ((t =self.local(year,1,1)).zone.upcase==zonerescuefalse)off =t.utc_offsetelsif ((t =self.local(year,7,1)).zone.upcase==zonerescuefalse)off =t.utc_offsetendoffend
Return the number of seconds the specified time zone differs from UTC.
Numeric time zones that include minutes, such as-10:00 or+1330 will work, as will simpler hour-only time zones like-10 or+13.
Textual time zones listed in ZoneOffset are also supported.
If the time zone does not match any of the above,zone_offset will check if the local time zone (both with and without potential Daylight Saving Time changes being in effect) matcheszone. Specifying a value foryear will change the year used to find the local time zone.
Ifzone_offset is unable to determine the offset, nil will be returned.
require'time'Time.zone_offset("EST")#=> -18000
You must require ‘time’ to use this method.
Public Instance Methods
Source
static VALUEtime_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);}Returns a newTime object whose value is the sum of the numeric value ofself and the givennumeric:
t =Time.new(2000)# => 2000-01-01 00:00:00 -0600t+ (60*60*24)# => 2000-01-02 00:00:00 -0600t+0.5# => 2000-01-01 00:00:00.5 -0600
Related:Time#-.
Source
static VALUEtime_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);}Whennumeric is given, returns a newTime object whose value is the difference of the numeric value ofself andnumeric:
t =Time.new(2000)# => 2000-01-01 00:00:00 -0600t- (60*60*24)# => 1999-12-31 00:00:00 -0600t-0.5# => 1999-12-31 23:59:59.5 -0600
Whenother_time is given, returns aFloat whose value is the difference of the numeric values ofself andother_time in seconds:
t-t# => 0.0
Related:Time#+.
Source
static VALUEtime_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);}Comparesself withother_time; returns:
-1, ifselfis less thanother_time.0, ifselfis equal toother_time.1, ifselfis greater thenother_time.nil, ifselfandother_timeare incomparable.
Examples:
t =Time.now# => 2007-11-19 08:12:12 -0600t2 =t+2592000# => 2007-12-19 08:12:12 -0600t<=>t2# => -1t2<=>t# => 1t =Time.now# => 2007-11-19 08:13:38 -0600t2 =t+0.1# => 2007-11-19 08:13:38 -0600t.nsec# => 98222999t2.nsec# => 198222999t<=>t2# => -1t2<=>t# => 1t<=>t# => 0
Source
# File ext/json/lib/json/add/time.rb, line 32defas_json(*) {JSON.create_id=>self.class.name,'s'=>tv_sec,'n'=>tv_nsec, }end
MethodsTime#as_json andTime.json_create may be used to serialize and deserialize a Time object; seeMarshal.
MethodTime#as_json serializesself, returning a 2-element hash representingself:
require'json/add/time'x =Time.now.as_json# => {"json_class"=>"Time", "s"=>1700931656, "n"=>472846644}
MethodJSON.create deserializes such a hash, returning a Time object:
Time.json_create(x)# => 2023-11-25 11:00:56.472846644 -0600
Source
static VALUEtime_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);}Returns a newTime object whose numerical value is greater than or equal toself with its seconds truncated to precisionndigits:
t =Time.utc(2010,3,30,5,43,25.123456789r)t# => 2010-03-30 05:43:25.123456789 UTCt.ceil# => 2010-03-30 05:43:26 UTCt.ceil(2)# => 2010-03-30 05:43:25.13 UTCt.ceil(4)# => 2010-03-30 05:43:25.1235 UTCt.ceil(6)# => 2010-03-30 05:43:25.123457 UTCt.ceil(8)# => 2010-03-30 05:43:25.12345679 UTCt.ceil(10)# => 2010-03-30 05:43:25.123456789 UTCt =Time.utc(1999,12,31,23,59,59)t# => 1999-12-31 23:59:59 UTC(t+0.4).ceil# => 2000-01-01 00:00:00 UTC(t+0.9).ceil# => 2000-01-01 00:00:00 UTC(t+1.4).ceil# => 2000-01-01 00:00:01 UTC(t+1.9).ceil# => 2000-01-01 00:00:01 UTC
Related:Time#floor,Time#round.
Source
static VALUEtime_asctime(VALUE time){ return strftimev("%a %b %e %T %Y", time, rb_usascii_encoding());}Returns a string representation ofself, formatted bystrftime('%a %b %e %T %Y') or its shorthand versionstrftime('%c'); seeFormats for Dates and Times:
t =Time.new(2000,12,31,23,59,59,0.5)t.ctime# => "Sun Dec 31 23:59:59 2000"t.strftime('%a %b %e %T %Y')# => "Sun Dec 31 23:59:59 2000"t.strftime('%c')# => "Sun Dec 31 23:59:59 2000"
Related:Time#to_s,Time#inspect:
t.inspect# => "2000-12-31 23:59:59.5 +000001"t.to_s# => "2000-12-31 23:59:59 +0000"
Source
static VALUEtime_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;}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)iftinwday:3,day:..7# uses deconstruct_keys underneathputs"first Wednesday of the month"end#=> prints "first Wednesday of the month"casetinyear:...2022puts"too old"inmonth:..9puts"quarter 1-3"inwday: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:
iftinTime(wday:3,day:..7)puts"first Wednesday of the month"end
Returnstrue ifself is in daylight saving time,false otherwise:
t =Time.local(2000,1,1)# => 2000-01-01 00:00:00 -0600t.zone# => "Central Standard Time"t.dst?# => falset =Time.local(2000,7,1)# => 2000-07-01 00:00:00 -0500t.zone# => "Central Daylight Time"t.dst?# => true
Source
static VALUEtime_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;}Returnstrue ifself andother_time are bothTime objects with the exact same time value.
Source
static VALUEtime_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);}Returns a newTime object whose numerical value is less than or equal toself with its seconds truncated to precisionndigits:
t =Time.utc(2010,3,30,5,43,25.123456789r)t# => 2010-03-30 05:43:25.123456789 UTCt.floor# => 2010-03-30 05:43:25 UTCt.floor(2)# => 2010-03-30 05:43:25.12 UTCt.floor(4)# => 2010-03-30 05:43:25.1234 UTCt.floor(6)# => 2010-03-30 05:43:25.123456 UTCt.floor(8)# => 2010-03-30 05:43:25.12345678 UTCt.floor(10)# => 2010-03-30 05:43:25.123456789 UTCt =Time.utc(1999,12,31,23,59,59)t# => 1999-12-31 23:59:59 UTC(t+0.4).floor# => 1999-12-31 23:59:59 UTC(t+0.9).floor# => 1999-12-31 23:59:59 UTC(t+1.4).floor# => 2000-01-01 00:00:00 UTC(t+1.9).floor# => 2000-01-01 00:00:00 UTC
Related:Time#ceil,Time#round.
Source
static VALUEtime_friday(VALUE time){ wday_p(5);}Returnstrue ifself represents a Friday,false otherwise:
t =Time.utc(2000,1,7)# => 2000-01-07 00:00:00 UTCt.friday?# => true
Related:Time#saturday?,Time#sunday?,Time#monday?.
Source
static VALUEtime_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));}Returns a newTime object representing the value ofself converted to a given timezone; ifzone isnil, the local timezone is used:
t =Time.utc(2000)# => 2000-01-01 00:00:00 UTCt.getlocal# => 1999-12-31 18:00:00 -0600t.getlocal('+12:00')# => 2000-01-01 12:00:00 +1200
For forms of argumentzone, seeTimezone Specifiers.
Returns a newTime object representing the value ofself converted to the UTC timezone:
local =Time.local(2000)# => 2000-01-01 00:00:00 -0600local.utc?# => falseutc =local.getutc# => 2000-01-01 06:00:00 UTCutc.utc?# => trueutc==local# => true
Source
static VALUEtime_hash(VALUE time){ struct time_object *tobj; GetTimeval(time, tobj); return rb_hash(w2v(tobj->timew));}Returns the integer hash code forself.
Related:Object#hash.
Source
static VALUEtime_hour(VALUE time){ struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.hour);}Returns the integer hour of the day forself, in range (0..23):
t =Time.new(2000,1,2,3,4,5,6)# => 2000-01-02 03:04:05 +000006t.hour# => 3
Source
# File lib/time.rb, line 695defhttpdategetutc.strftime('%a, %d %b %Y %T GMT')end
Returns a string which represents the time as RFC 1123 date of HTTP-date defined by RFC 2616:
day-of-week, DD month-name CCYY hh:mm:ss GMT
Note that the result is always UTC (GMT).
require'time't =Time.nowt.httpdate# => "Thu, 06 Oct 2011 02:26:12 GMT"
You must require ‘time’ to use this method.
Source
static VALUEtime_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;}Returns a string representation ofself with subseconds:
t =Time.new(2000,12,31,23,59,59,0.5)t.inspect# => "2000-12-31 23:59:59.5 +000001"
Related:Time#ctime,Time#to_s:
t.ctime# => "Sun Dec 31 23:59:59 2000"t.to_s# => "2000-12-31 23:59:59 +0000"
Parsestime as a dateTime defined by the XML Schema and converts it to aTime object. The format is a restricted version of the format defined by ISO 8601.
ArgumentError is raised iftime is not compliant with the format or if theTime class cannot represent the specified time.
Seexmlschema for more information on this format.
require'time'Time.xmlschema("2011-10-05T22:26:12-04:00")#=> 2011-10-05 22:26:12-04:00
You must require ‘time’ to use this method.
Source
static VALUEtime_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);}With no argument given:
Returns
selfifselfis a local time.Otherwise returns a new
Timein the user’s local timezone:t =Time.utc(2000,1,1,20,15,1)# => 2000-01-01 20:15:01 UTCt.localtime# => 2000-01-01 14:15:01 -0600
With argumentzone given, returns the newTime object created by convertingself to the given time zone:
t =Time.utc(2000,1,1,20,15,1)# => 2000-01-01 20:15:01 UTCt.localtime("-09:00")# => 2000-01-01 11:15:01 -0900
For forms of argumentzone, seeTimezone Specifiers.
Source
static VALUEtime_min(VALUE time){ struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.min);}Returns the integer minute of the hour forself, in range (0..59):
t =Time.new(2000,1,2,3,4,5,6)# => 2000-01-02 03:04:05 +000006t.min# => 4
Source
static VALUEtime_mon(VALUE time){ struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.mon);}Returns the integer month of the year forself, in range (1..12):
t =Time.new(2000,1,2,3,4,5,6)# => 2000-01-02 03:04:05 +000006t.mon# => 1
Source
static VALUEtime_monday(VALUE time){ wday_p(1);}Returnstrue ifself represents a Monday,false otherwise:
t =Time.utc(2000,1,3)# => 2000-01-03 00:00:00 UTCt.monday?# => true
Related:Time#tuesday?,Time#wednesday?,Time#thursday?.
Returns the number of nanoseconds in the subseconds part ofself in the range (0..999_999_999); lower-order digits are truncated, not rounded:
t =Time.now# => 2022-07-11 15:04:53.3219637 -0500t.nsec# => 321963700
Related:Time#subsec (returns exact subseconds).
Source
# File lib/time.rb, line 675defrfc2822strftime('%a, %d %b %Y %T ')<< (utc??'-0000':strftime('%z'))end
Returns a string which represents the time as date-time defined by RFC 2822:
day-of-week, DD month-name CCYY hh:mm:ss zone
where zone is [+-]hhmm.
Ifself is a UTC time, -0000 is used as zone.
require'time't =Time.nowt.rfc2822# => "Wed, 05 Oct 2011 22:26:12 -0400"
You must require ‘time’ to use this method.
Source
static VALUEtime_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);}Returns a newTime object whose numeric value is that ofself, with its seconds value rounded to precisionndigits:
t =Time.utc(2010,3,30,5,43,25.123456789r)t# => 2010-03-30 05:43:25.123456789 UTCt.round# => 2010-03-30 05:43:25 UTCt.round(0)# => 2010-03-30 05:43:25 UTCt.round(1)# => 2010-03-30 05:43:25.1 UTCt.round(2)# => 2010-03-30 05:43:25.12 UTCt.round(3)# => 2010-03-30 05:43:25.123 UTCt.round(4)# => 2010-03-30 05:43:25.1235 UTCt =Time.utc(1999,12,31,23,59,59)t# => 1999-12-31 23:59:59 UTC(t+0.4).round# => 1999-12-31 23:59:59 UTC(t+0.49).round# => 1999-12-31 23:59:59 UTC(t+0.5).round# => 2000-01-01 00:00:00 UTC(t+1.4).round# => 2000-01-01 00:00:00 UTC(t+1.49).round# => 2000-01-01 00:00:00 UTC(t+1.5).round# => 2000-01-01 00:00:01 UTC
Related:Time#ceil,Time#floor.
Source
static VALUEtime_saturday(VALUE time){ wday_p(6);}Returnstrue ifself represents a Saturday,false otherwise:
t =Time.utc(2000,1,1)# => 2000-01-01 00:00:00 UTCt.saturday?# => true
Related:Time#sunday?,Time#monday?,Time#tuesday?.
Source
static VALUEtime_sec(VALUE time){ struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.sec);}Returns the integer second of the minute forself, in range (0..60):
t =Time.new(2000,1,2,3,4,5,6)# => 2000-01-02 03:04:05 +000006t.sec# => 5
Note: the second value may be 60 when there is aleap second.
Source
static VALUEtime_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; }}Returns a string representation ofself, formatted according to the given stringformat. SeeFormats for Dates and Times.
Source
static VALUEtime_subsec(VALUE time){ struct time_object *tobj; GetTimeval(time, tobj); return quov(w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE))), INT2FIX(TIME_SCALE));}Returns the exact subseconds forself as aNumeric (Integer orRational):
t =Time.now# => 2022-07-11 15:11:36.8490302 -0500t.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 -0600t.subsec# => 0
Source
static VALUEtime_sunday(VALUE time){ wday_p(0);}Returnstrue ifself represents a Sunday,false otherwise:
t =Time.utc(2000,1,2)# => 2000-01-02 00:00:00 UTCt.sunday?# => true
Related:Time#monday?,Time#tuesday?,Time#wednesday?.
Source
static VALUEtime_thursday(VALUE time){ wday_p(4);}Returnstrue ifself represents a Thursday,false otherwise:
t =Time.utc(2000,1,6)# => 2000-01-06 00:00:00 UTCt.thursday?# => true
Related:Time#friday?,Time#saturday?,Time#sunday?.
Source
static VALUEtime_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));}Returns a 10-element array of values representingself:
Time.utc(2000,1,1).to_a# => [0, 0, 0, 1, 1, 2000, 6, 1, false, "UTC"]# [sec, min, hour, day, mon, year, wday, yday, dst?, zone]
The returned array is suitable for use as an argument toTime.utc orTime.local to create a newTime object.
Source
static VALUEtime_to_date(VALUE self){ VALUE y, nth, ret; int ry, m, d; y = f_year(self); m = FIX2INT(f_mon(self)); d = FIX2INT(f_mday(self)); decode_year(y, -1, &nth, &ry); ret = d_simple_new_internal(cDate, nth, 0, GREGORIAN, ry, m, d, HAVE_CIVIL); { get_d1(ret); set_sg(dat, DEFAULT_SG); } return ret;}Returns aDate object which denotes self.
Source
static VALUEtime_to_datetime(VALUE self){ VALUE y, sf, nth, ret; int ry, m, d, h, min, s, of; y = f_year(self); m = FIX2INT(f_mon(self)); d = FIX2INT(f_mday(self)); h = FIX2INT(f_hour(self)); min = FIX2INT(f_min(self)); s = FIX2INT(f_sec(self)); if (s == 60) s = 59; sf = sec_to_ns(f_subsec(self)); of = FIX2INT(f_utc_offset(self)); decode_year(y, -1, &nth, &ry); ret = d_complex_new_internal(cDateTime, nth, 0, 0, sf, of, GREGORIAN, ry, m, d, h, min, s, HAVE_CIVIL | HAVE_TIME); { get_d1(ret); set_sg(dat, DEFAULT_SG); } return ret;}Returns aDateTime object which denotes self.
Source
static VALUEtime_to_f(VALUE time){ struct time_object *tobj; GetTimeval(time, tobj); return rb_Float(rb_time_unmagnify_to_float(tobj->timew));}Returns the value ofself as aFloat numberEpoch seconds; subseconds are included.
The stored value ofself is aRational, which means that the returned value may be approximate:
Time.utc(1970,1,1,0,0,0).to_f# => 0.0Time.utc(1970,1,1,0,0,0,999999).to_f# => 0.999999Time.utc(1950,1,1,0,0,0).to_f# => -631152000.0Time.utc(1990,1,1,0,0,0).to_f# => 631152000.0
Source
static VALUEtime_to_i(VALUE time){ struct time_object *tobj; GetTimeval(time, tobj); return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE)));}Returns the value ofself as integerEpoch seconds; subseconds are truncated (not rounded):
Time.utc(1970,1,1,0,0,0).to_i# => 0Time.utc(1970,1,1,0,0,0,999999).to_i# => 0Time.utc(1950,1,1,0,0,0).to_i# => -631152000Time.utc(1990,1,1,0,0,0).to_i# => 631152000
Source
# File ext/json/lib/json/add/time.rb, line 49defto_json(*args)as_json.to_json(*args)end
Returns aJSON string representingself:
require'json/add/time'putsTime.now.to_json
Output:
{"json_class":"Time","s":1700931678,"n":980650786}Source
static VALUEtime_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;}Returns the value ofself as aRational exact number ofEpoch seconds;
Time.now.to_r# => (16571402750320203/10000000)
Source
static VALUEtime_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());}Returns a string representation ofself, without subseconds:
t =Time.new(2000,12,31,23,59,59,0.5)t.to_s# => "2000-12-31 23:59:59 +0000"
Related:Time#ctime,Time#inspect:
t.ctime# => "Sun Dec 31 23:59:59 2000"t.inspect# => "2000-12-31 23:59:59.5 +000001"
Source
static VALUEtime_tuesday(VALUE time){ wday_p(2);}Returnstrue ifself represents a Tuesday,false otherwise:
t =Time.utc(2000,1,4)# => 2000-01-04 00:00:00 UTCt.tuesday?# => true
Related:Time#wednesday?,Time#thursday?,Time#friday?.
Returns the number of microseconds in the subseconds part ofself in the range (0..999_999); lower-order digits are truncated, not rounded:
t =Time.now# => 2022-07-11 14:59:47.5484697 -0500t.usec# => 548469
Related:Time#subsec (returns exact subseconds).
Returnsself, converted to the UTC timezone:
t =Time.new(2000)# => 2000-01-01 00:00:00 -0600t.utc?# => falset.utc# => 2000-01-01 06:00:00 UTCt.utc?# => true
Related:Time#getutc (returns a new convertedTime object).
Source
static VALUEtime_utc_p(VALUE time){ struct time_object *tobj; GetTimeval(time, tobj); return RBOOL(TZMODE_UTC_P(tobj));}Returnstrue ifself represents a time in UTC (GMT):
now =Time.now# => 2022-08-18 10:24:13.5398485 -0500now.utc?# => falsenow.getutc.utc?# => trueutc =Time.utc(2000,1,1,20,15,1)# => 2000-01-01 20:15:01 UTCutc.utc?# => true
Time objects created with these methods are considered to be in UTC:
Objects created in other ways will not be treated as UTC even if the environment variable “TZ” is “UTC”.
Related:Time.utc.
Returns the offset in seconds between the timezones of UTC andself:
Time.utc(2000,1,1).utc_offset# => 0Time.local(2000,1,1).utc_offset# => -21600 # -6*3600, or minus six hours.
Source
static VALUEtime_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);}Returns the integer day of the week forself, in range (0..6), with Sunday as zero.
t =Time.new(2000,1,2,3,4,5,6)# => 2000-01-02 03:04:05 +000006t.wday# => 0t.sunday?# => true
Source
static VALUEtime_wednesday(VALUE time){ wday_p(3);}Returnstrue ifself represents a Wednesday,false otherwise:
t =Time.utc(2000,1,5)# => 2000-01-05 00:00:00 UTCt.wednesday?# => true
Related:Time#thursday?,Time#friday?,Time#saturday?.
Source
# File lib/time.rb, line 721defxmlschema(fraction_digits=0)fraction_digits =fraction_digits.to_is =strftime("%FT%T")iffraction_digits>0s<<strftime(".%#{fraction_digits}N")ends<< (utc??'Z':strftime("%:z"))end
Returns a string which represents the time as a dateTime defined by XML Schema:
CCYY-MM-DDThh:mm:ssTZDCCYY-MM-DDThh:mm:ss.sssTZD
where TZD is Z or [+-]hh:mm.
If self is a UTC time, Z is used as TZD. [+-]hh:mm is used otherwise.
fraction_digits specifies a number of digits to use for fractional seconds. Its default value is 0.
require'time't =Time.nowt.iso8601# => "2011-10-05T22:26:12-04:00"
You must require ‘time’ to use this method.
Source
static VALUEtime_yday(VALUE time){ struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM_ENSURE(time, tobj, tobj->vtm.yday != 0); return INT2FIX(tobj->vtm.yday);}Returns the integer day of the year ofself, in range (1..366).
Time.new(2000,1,1).yday# => 1Time.new(2000,12,31).yday# => 366
Source
Source
static VALUEtime_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;}Returns the string name of the time zone forself:
Time.utc(2000,1,1).zone# => "UTC"Time.new(2000,1,1).zone# => "Central Standard Time"