A Time object represents a date and time:

Time.new(2000, 1, 1, 0, 0, 0) 

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)

t.year 
t.month 
t.mday 
t.hour 
t.min 
t.sec 
t.subsec 

t = Time.new(2000, 12, 31, 23, 59, 59.5)

t.year 
t.month 
t.mday 
t.hour 
t.min 
t.sec 
t.subsec 

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 Time.to_r:

Time.at(0).to_r        
Time.at(0.999999).to_r 

Other retrieval methods such as Time#to_i and Time#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 Time.now) has the resolution supported by the system.

Time Internal Representation

Conceptually, Time class uses a rational value to represent the number of seconds from Epoch, 1970-01-01 00:00:00 UTC. There are no boundary or resolution limitations. The value can be obtained using Time#to_r.

The Time 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 from Epoch. The signed 63 bit integer can represent 1823-11-12 to 2116-02-20. When Integer or Rational 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 function localtime and gmtime to map between the number and 6-tuple (year,month,day,hour,minute,second). localtime is used for local time and gmtime is used for UTC.

Integer and Rational has no range limit, but the localtime and gmtime has range limits due to the C types time_t and struct 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. However localtime on some platforms doesn’t supports negative time_t (before 1970).

struct tm has tm_year member to represent years. (tm_year = 0 means the year 1900.) It is defined as int in the C standard. tm_year can represent years between -2147481748 to 2147485547 if int is 32 bit.

Ruby supports leap seconds as far as if the C function localtime and gmtime 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 New Time Instance

You can create a new instance of Time with Time.new. This will use the current system time. Time.now is an alias for this. You can also pass parts of the time to Time.new such as year, month, minute, etc. When you want to construct a time this way you must pass at least a year. If you pass the year with nothing else time will default to January 1 of that year at 00:00:00 with the current system timezone. Here are some examples:

Time.new(2002)         
Time.new(2002, 10)     
Time.new(2002, 10, 31) 

You can pass a UTC offset:

Time.new(2002, 10, 31, 2, 2, 2, "+02:00") 

Or a timezone object:

zone = timezone("Europe/Athens")      
Time.new(2002, 10, 31, 2, 2, 2, zone) 

You can also use Time.local and Time.utc to infer local and UTC timezones instead of using the current system setting.

You can also create a new time using Time.at which takes the number of seconds (with subsecond) since the Unix Epoch.

Time.at(628232400) 

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? 

What year was that again?

t.year 

Was it daylight savings at the time?

t.dst? 

What’s the day a year later?

t + (60*60*24*365) 

How many seconds was that since the Unix Epoch?

t.to_i 

You can also do standard functions like compare two times.

t1 = Time.new(2010)
t2 = Time.new(2011)

t1 == t2 
t1 == t1 
t1 <  t2 
t1 >  t2 

Time.new(2010,10,31).between?(t1, t2) 

What’s Here

First, what’s elsewhere. Class Time:

Here, class Time 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.

  • month (aliased as mon): Returns the month of the time.

  • mday (aliased as day): Returns the day of the month.

  • 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

  • utc? (aliased as gmt?): Returns whether the time is UTC.

  • 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

  • <=>: Compares self to another time.

  • eql?: Returns whether the time is equal to another time.

Methods for Converting

  • asctime (aliased as ctime): Returns the time as a string.

  • 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.

  • utc (aliased as gmtime): Converts time to UTC in place.

  • 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 Timezone Specifiers.

Timezone Specifiers

Certain Time methods accept arguments that specify timezones:

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:

  • HH is the 2-digit hour in the range 0..23.

  • MM is the 2-digit minute in the range 0..59.

Examples:

t = Time.utc(2000, 1, 1, 20, 15, 1) 
Time.at(t, in: '-23:59')            
Time.at(t, in: '+23:59')            

Single-Letter Offsets

The zone value may be a letter in the range 'A'..'I' or 'K'..'Z'; see List of military time zones:

t = Time.utc(2000, 1, 1, 20, 15, 1) 
Time.at(t, in: 'A')                 
Time.at(t, in: 'I')                 
Time.at(t, in: 'K')                 
Time.at(t, in: 'Y')                 
Time.at(t, in: 'Z')                 

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) 
Time.at(t, in: -86399)              
Time.at(t, in: 86399)               

Timezone Objects

The zone value may be an object responding to certain timezone methods, an instance of Timezone and TZInfo for example.

The timezone methods are:

  • local_to_utc:

    Called when Time.new is invoked with tz as the value of positional argument zone or keyword argument in:.

    Argument

    a Time-like object.

    Returns

    a Time-like object in the UTC timezone.

  • utc_to_local:

    Called when Time.at or Time.now is invoked with tz as the value for keyword argument in:, and when Time#getlocal or Time#localtime is called with tz as the value for positional argument zone.

    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, its utc_offset is also counted.

    Argument

    a Time-like object.

    Returns

    a Time-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#strftime is invoked with a format involving %Z.

    Argument

    a Time-like object.

    Returns

    a string abbreviation for the timezone name.

  • dst?:

    Called when Time.at or Time.now is invoked with tz as the value for keyword argument in:, and when Time#getlocal or Time#localtime is called with tz as the value for positional argument zone.

    Argument

    a Time-like object.

    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

A Time-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 to Time, except that timezone related attributes are meaningless.

The objects returned by local_to_utc and utc_to_local methods of the timezone object may be of the same class as their arguments, of arbitrary object classes, or of class Integer.

For a returned class other than Integer, the class must have the following methods:

  • year

  • mon

  • mday

  • hour

  • min

  • sec

  • isdst

  • to_i

For a returned Integer, 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) has find_timezone singleton method, this method is called to achieve the corresponding timezone object from a timezone name.

For example, using Timezone:

class TimeWithTimezone < Time
  require 'timezone'
  def self.find_timezone(z) = Timezone[z]
end

TimeWithTimezone.now(in: "America/New_York")        
TimeWithTimezone.new("2023-12-25 America/New_York") 

Or, using TZInfo:

class TimeWithTZInfo < Time
  require 'tzinfo'
  def self.find_timezone(z) = TZInfo::Timezone.get(z)
end

TimeWithTZInfo.now(in: "America/New_York")          
TimeWithTZInfo.new("2023-12-25 America/New_York")   

You can define this method per subclasses, or on the toplevel Time class.

Public Class Methods

Source

def self.at(time, subsec = false, unit = :microsecond, in: nil)
  if Primitive.mandatory_only?
    Primitive.time_s_at1(time)
  else
    Primitive.time_s_at(time, subsec, unit, Primitive.arg!(:in))
  end
end

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) 
secs = t.to_i                          
Time.at(secs)                          
Time.at(secs + 0.5)                    
Time.at(1000000000)                    
Time.at(0)                             
Time.at(-1000000000)                   

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)     
    Time.at(secs, 500, :millisecond)   
    Time.at(secs, 1000, :millisecond)  
    Time.at(secs, -1000, :millisecond) 
    
  • :microsecond or :usec: subsec in microseconds:

    Time.at(secs, 0, :microsecond)        
    Time.at(secs, 500000, :microsecond)   
    Time.at(secs, 1000000, :microsecond)  
    Time.at(secs, -1000000, :microsecond) 
    
  • :nanosecond or :nsec: subsec in nanoseconds:

    Time.at(secs, 0, :nanosecond)           
    Time.at(secs, 500000000, :nanosecond)   
    Time.at(secs, 1000000000, :nanosecond)  
    Time.at(secs, -1000000000, :nanosecond) 
    

Optional keyword argument in: zone specifies the timezone for the returned time:

Time.at(secs, in: '+12:00') 
Time.at(secs, in: '-12:00') 

For the forms of argument zone, see Timezone Specifiers.

Source

def httpdate(date)
  if date.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).utc
  elsif /\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 =~ date
    year = $3.to_i
    if year < 50
      year += 2000
    else
      year += 1900
    end
    self.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 =~ date
    self.utc($6.to_i, MonthValue[$1.upcase], $2.to_i,
             $3.to_i, $4.to_i, $5.to_i)
  else
    raise ArgumentError.new("not RFC 2616 compliant date: #{date.inspect}")
  end
end

Parses date as an HTTP-date defined by RFC 2616 and converts it to a Time object.

ArgumentError is raised if date is not compliant with RFC 2616 or if the Time class cannot represent specified date.

See httpdate for more information on this format.

require 'time'

Time.httpdate("Thu, 06 Oct 2011 02:26:12 GMT")

You must require ‘time’ to use this method.

Source

def self.json_create(object)
  if usec = object.delete('u') 
    object['n'] = usec * 1000
  end
  at(object['s'], Rational(object['n'], 1000))
end

Source

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)));
}

Like Time.utc, except that the returned Time object has the local timezone, not the UTC timezone:

Time.local(0, 1, 2, 3, 4, 5, 6)


Time.local(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

Source

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

Returns a new Time object based on the given arguments, by default in the local timezone.

With no positional arguments, returns the value of Time.now:

Time.new 

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')              
Time.new('2000-12-31 23:59:59.5 +0900')        
Time.new('2000-12-31 23:59:59.5', in: '+0900') 
Time.new('2000-12-31 23:59:59.5')              
Time.new('2000-12-31 23:59:59.56789', precision: 3) 

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) 

For the positional arguments (other than zone):

  • year: Year, with no range limits:

    Time.new(999999999)  
    Time.new(-999999999) 
    
  • month: Month in range (1..12), or case-insensitive 3-letter month name:

    Time.new(2000, 1)     
    Time.new(2000, 12)    
    Time.new(2000, 'jan') 
    Time.new(2000, 'JAN') 
    
  • mday: Month day in range(1..31):

    Time.new(2000, 1, 1)  
    Time.new(2000, 1, 31) 
    
  • hour: Hour in range (0..23), or 24 if min, sec, and usec are zero:

    Time.new(2000, 1, 1, 0)  
    Time.new(2000, 1, 1, 23) 
    Time.new(2000, 1, 1, 24) 
    
  • min: Minute in range (0..59):

    Time.new(2000, 1, 1, 0, 0)  
    Time.new(2000, 1, 1, 0, 59) 
    
  • sec: Second in range (0…61):

    Time.new(2000, 1, 1, 0, 0, 0)  
    Time.new(2000, 1, 1, 0, 0, 59) 
    Time.new(2000, 1, 1, 0, 0, 60) 
    

    sec may be Float or Rational.

    Time.new(2000, 1, 1, 0, 0, 59.5)  
    Time.new(2000, 1, 1, 0, 0, 59.7r) 
    

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)
    
    
  • String integers:

    a = %w[0 1 1 0 0 0]
    
    Time.new(*a) 
    

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')

Time.new(2000, 1, 1, 0, 0, 0, in: '-12:00')

Time.new(in: '-12:00')

Since in: 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  
  • 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.

Source

def self.now(in: nil)
  Primitive.time_s_now(Primitive.arg!(:in))
end

Creates a new Time object from the current system time. This is the same as Time.new without arguments.

Time.now               
Time.now(in: '+04:00') 

For forms of argument zone, see Timezone Specifiers.

Source

def parse(date, now=self.now)
  comp = !block_given?
  d = Date._parse(date, comp)
  year = d[:year]
  year = yield(year) if year && !comp
  make_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 a Time 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 use Time.strptime instead of this method as possible.

require 'time'

Time.parse("2010-10-31") 

Any missing pieces of the date are inferred based on the current date.

require 'time'


Time.parse("12:00") 

We can change the date used to infer our missing elements by passing a second object that responds to mon, day and year, such as Date, Time or DateTime. We can also use our own object.

require 'time'

class MyDate
  attr_reader :mon, :day, :year

  def initialize(mon, day, year)
    @mon, @day, @year = mon, day, year
  end
end

d  = 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)  
Time.parse("12:00", t)  
Time.parse("12:00", dt) 
Time.parse("12:00", md) 

If a block is given, the year described in date 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)}

Time.parse("70-10-31") {|year| year + (year < 70 ? 2000 : 1900)}

If the upper components of the given time are broken or missing, they are supplied with those of now. For the lower components, the minimum values (1 or 0) are assumed if broken or missing. For example:

require 'time'



now = Time.parse("Thu Nov 29 14:33:20 2001")
Time.parse("16:30", now)     
Time.parse("7/23", now)      
Time.parse("Aug 31", now)    
Time.parse("Aug 2000", now)  

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 from Time.local(year, 1, 1).zone and Time.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 if Date._parse cannot extract information from date or if the Time class cannot represent specified date.

This method can be used as a fail-safe for other parsing methods as:

Time.rfc2822(date) rescue Time.parse(date)
Time.httpdate(date) rescue Time.parse(date)
Time.xmlschema(date) rescue Time.parse(date)

A failure of Time.parse should be checked, though.

You must require ‘time’ to use this method.

Source

def rfc2822(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
    
    day = $1.to_i
    mon = MonthValue[$2.upcase]
    year = $3.to_i
    short_year_p = $3.length <= 3
    hour = $4.to_i
    min = $5.to_i
    sec = $6 ? $6.to_i : 0
    zone = $7

    if short_year_p
      
      year = if year < 50
               2000 + year
             else
               1900 + year
             end
    end

    off = 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)
    t
  else
    raise ArgumentError.new("not RFC 2822 compliant date: #{date.inspect}")
  end
end

Parses date as date-time defined by RFC 2822 and converts it to a Time object. The format is identical to the date format defined by RFC 822 and updated by RFC 1123.

ArgumentError is raised if date is not compliant with RFC 2822 or if the Time class cannot represent specified date.

See rfc2822 for more information on this format.

require 'time'

Time.rfc2822("Wed, 05 Oct 2011 22:26:12 -0400")

You must require ‘time’ to use this method.

Source

def strptime(date, format, now=self.now)
  d = Date._strptime(date, format)
  raise ArgumentError, "invalid date or strptime format - '#{date}' '#{format}'" unless d
  if seconds = d[:seconds]
    if sec_fraction = d[:sec_fraction]
      usec = sec_fraction * 1000000
      usec *= -1 if seconds < 0
    else
      usec = 0
    end
    t = Time.at(seconds, usec)
    if zone = d[:zone]
      force_zone!(t, zone)
    end
  else
    year = d[:year]
    year = yield(year) if year && block_given?
    yday = d[:yday]
    if (d[:cwyear] && !year) || ((d[:cwday] || d[:cweek]) && !(d[:mon] && d[:mday]))
      
      return Date.strptime(date, format).to_time
    end
    if (d[:wnum0] || d[:wnum1]) && !yday && !(d[:mon] && d[:mday])
      yday = Date.strptime(date, format).yday
    end
    t = make_time(date, year, yday, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
  end
  t
end

Works similar to parse 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.

Raises ArgumentError if the date or format is invalid.

If a block is given, the year described in date 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") 

You must require ‘time’ to use this method.

Source

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)));
}

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)  
Time.utc(-2000) 

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)     
    Time.utc(2000, 12)    
    Time.utc(2000, 'jan') 
    Time.utc(2000, 'JAN') 
    
  • mday: Month day in range(1..31):

    Time.utc(2000, 1, 1)  
    Time.utc(2000, 1, 31) 
    
  • hour: Hour in range (0..23), or 24 if min, sec, and usec are zero:

    Time.utc(2000, 1, 1, 0)  
    Time.utc(2000, 1, 1, 23) 
    Time.utc(2000, 1, 1, 24) 
    
  • min: Minute in range (0..59):

    Time.utc(2000, 1, 1, 0, 0)  
    Time.utc(2000, 1, 1, 0, 59) 
    
  • sec: Second in range (0..59), or 60 if usec is zero:

    Time.utc(2000, 1, 1, 0, 0, 0)  
    Time.utc(2000, 1, 1, 0, 0, 59) 
    Time.utc(2000, 1, 1, 0, 0, 60) 
    
  • usec: Microsecond in range (0..999999):

    Time.utc(2000, 1, 1, 0, 0, 0, 0)      
    Time.utc(2000, 1, 1, 0, 0, 0, 999999) 
    

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)
    
    
  • String integers:

    a = %w[0 1 1 0 0 0 0 0]
    
    Time.utc(*a) 
    

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]

Time.utc(*a) 

This form is useful for creating a Time object from a 10-element array returned by Time.to_a:

t = Time.new(2000, 1, 2, 3, 4, 5, 6) 
a = t.to_a   
Time.utc(*a) 

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.

Also aliased as: gm

Source

def xmlschema(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 =~ time
    year = $1.to_i
    mon = $2.to_i
    day = $3.to_i
    hour = $4.to_i
    min = $5.to_i
    sec = $6.to_i
    usec = 0
    if $7
      usec = Rational($7) * 1000000
    end
    if $8
      zone = $8
      off = 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)
      t
    else
      self.local(year, mon, day, hour, min, sec, usec)
    end
  else
    raise ArgumentError.new("invalid xmlschema format: #{time.inspect}")
  end
end

Parses time as a dateTime defined by the XML Schema and converts it to a Time object. The format is a restricted version of the format defined by ISO 8601.

ArgumentError is raised if time is not compliant with the format or if the Time class cannot represent the specified time.

See xmlschema for more information on this format.

require 'time'

Time.xmlschema("2011-10-05T22:26:12-04:00")

You must require ‘time’ to use this method.

Source

def zone_offset(zone, year=nil)
  off = nil
  zone = zone.upcase
  if /\A([+-])(\d\d)(:?)(\d\d)(?:\3(\d\d))?\z/ =~ zone
    off = ($1 == '-' ? -1 : 1) * (($2.to_i * 60 + $4.to_i) * 60 + $5.to_i)
  elsif zone.match?(/\A[+-]\d\d\z/)
    off = zone.to_i * 3600
  elsif ZoneOffset.include?(zone)
    off = ZoneOffset[zone] * 3600
  else
    year ||= self.now.year
    if ((t = self.local(year, 1, 1)).zone.upcase == zone rescue false)
      off = t.utc_offset
    elsif ((t = self.local(year, 7, 1)).zone.upcase == zone rescue false)
      off = t.utc_offset
    end
  end
  off
end

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) matches zone. Specifying a value for year will change the year used to find the local time zone.

If zone_offset is unable to determine the offset, nil will be returned.

require 'time'

Time.zone_offset("EST") 

You must require ‘time’ to use this method.

Public Instance Methods

Source

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);
}

Returns a new Time object whose value is the sum of the numeric value of self and the given numeric:

t = Time.new(2000) 
t + (60 * 60 * 24) 
t + 0.5            

Related: Time#-.

Source

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);
}

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) 
t - (60 * 60 * 24) 
t - 0.5            

When other_time is given, returns a Float whose value is the difference of the numeric values of self and other_time in seconds:

t - t 

Related: Time#+.

Source

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);
}

Compares self with other_time; returns:

  • -1, if self is less than other_time.

  • 0, if self is equal to other_time.

  • 1, if self is greater then other_time.

  • nil, if self and other_time are incomparable.

Examples:

t = Time.now     
t2 = t + 2592000 
t <=> t2         
t2 <=> t         

t = Time.now     
t2 = t + 0.1     
t.nsec           
t2.nsec          
t <=> t2         
t2 <=> t         
t <=> t          

Source

def as_json(*)
  {
    JSON.create_id => self.class.name,
    's'            => tv_sec,
    'n'            => tv_nsec,
  }
end

Methods Time#as_json and Time.json_create may be used to serialize and deserialize a Time object; see Marshal.

Method Time#as_json serializes self, returning a 2-element hash representing self:

require 'json/add/time'
x = Time.now.as_json

Method JSON.create deserializes such a hash, returning a Time object:

Time.json_create(x)

Source

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);
}

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          
t.ceil     
t.ceil(2)  
t.ceil(4)  
t.ceil(6)  
t.ceil(8)  
t.ceil(10) 

t = Time.utc(1999, 12, 31, 23, 59, 59)
t              
(t + 0.4).ceil 
(t + 0.9).ceil 
(t + 1.4).ceil 
(t + 1.9).ceil 

Related: Time#floor, Time#round.

Source

static VALUE
time_asctime(VALUE time)
{
    return strftimev("%a %b %e %T %Y", time, rb_usascii_encoding());
}

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                      
t.strftime('%a %b %e %T %Y') 
t.strftime('%c')             

Related: Time#to_s, Time#inspect:

t.inspect                    
t.to_s                       

Source

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;
}

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  
  puts "first Wednesday of the month"
end


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

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

Returns true if self is in daylight saving time, false otherwise:

t = Time.local(2000, 1, 1) 
t.zone                     
t.dst?                     
t = Time.local(2000, 7, 1) 
t.zone                     
t.dst?                     

Source

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;
}

Returns true if self and other_time are both Time objects with the exact same time value.

Source

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);
}

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           
t.floor     
t.floor(2)  
t.floor(4)  
t.floor(6)  
t.floor(8)  
t.floor(10) 

t = Time.utc(1999, 12, 31, 23, 59, 59)
t               
(t + 0.4).floor 
(t + 0.9).floor 
(t + 1.4).floor 
(t + 1.9).floor 

Related: Time#ceil, Time#round.

Source

static VALUE
time_friday(VALUE time)
{
    wday_p(5);
}

Source

static VALUE
time_getgmtime(VALUE time)
{
    return time_gmtime(time_dup(time));
}

Source

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));
}

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)                    
t.getlocal                            
t.getlocal('+12:00')                  

For forms of argument zone, see Timezone Specifiers.

Returns a new Time object representing the value of self converted to the UTC timezone:

local = Time.local(2000) 
local.utc?               
utc = local.getutc       
utc.utc?                 
utc == local             

Source

static VALUE
time_gmtime(VALUE time)
{
    struct time_object *tobj;
    struct vtm vtm;

    GetTimeval(time, tobj);
    if (TZMODE_UTC_P(tobj)) {
        if (tobj->vtm.tm_got)
            return time;
    }
    else {
        time_modify(time);
    }

    vtm.zone = str_utc;
    GMTIMEW(tobj->timew, &vtm);
    time_set_vtm(time, tobj, vtm);

    tobj->vtm.tm_got = 1;
    TZMODE_SET_UTC(tobj);
    return time;
}

Also aliased as: utc

Source

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;
    }
}

Source

static VALUE
time_hash(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    return rb_hash(w2v(tobj->timew));
}

Returns the integer hash code for self.

Related: Object#hash.

Source

static VALUE
time_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 for self, in range (0..23):

t = Time.new(2000, 1, 2, 3, 4, 5, 6)

t.hour 

Related: Time#year, Time#mon, Time#min.

Source

def httpdate
  getutc.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.now
t.httpdate 

You must require ‘time’ to use this method.

Source

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;
}

Returns a string representation of self with subseconds:

t = Time.new(2000, 12, 31, 23, 59, 59, 0.5)
t.inspect 

Related: Time#ctime, Time#to_s:

t.ctime   
t.to_s    

Source

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);
}

Also aliased as: dst?

Parses time as a dateTime defined by the XML Schema and converts it to a Time object. The format is a restricted version of the format defined by ISO 8601.

ArgumentError is raised if time is not compliant with the format or if the Time class cannot represent the specified time.

See xmlschema for more information on this format.

require 'time'

Time.xmlschema("2011-10-05T22:26:12-04:00")

You must require ‘time’ to use this method.

Source

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);
}

With no argument given:

  • Returns self if self is a local time.

  • Otherwise returns a new Time in the user’s local timezone:

    t = Time.utc(2000, 1, 1, 20, 15, 1) 
    t.localtime                         
    

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) 
t.localtime("-09:00")               

For forms of argument zone, see Timezone Specifiers.

Source

static VALUE
time_mday(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    MAKE_TM(time, tobj);
    return INT2FIX(tobj->vtm.mday);
}

Returns the integer day of the month for self, in range (1..31):

t = Time.new(2000, 1, 2, 3, 4, 5, 6)

t.mday 

Related: Time#year, Time#hour, Time#min.

Also aliased as: day

Source

static VALUE
time_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 for self, in range (0..59):

t = Time.new(2000, 1, 2, 3, 4, 5, 6)

t.min 

Related: Time#year, Time#mon, Time#sec.

Source

static VALUE
time_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 for self, in range (1..12):

t = Time.new(2000, 1, 2, 3, 4, 5, 6)

t.mon 

Related: Time#year, Time#hour, Time#min.

Also aliased as: month

Source

static VALUE
time_monday(VALUE time)
{
    wday_p(1);
}

Returns the number of nanoseconds in the subseconds part of self in the range (0..999_999_999); lower-order digits are truncated, not rounded:

t = Time.now 
t.nsec       

Related: Time#subsec (returns exact subseconds).

Source

def rfc2822
  strftime('%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.

If self is a UTC time, -0000 is used as zone.

require 'time'

t = Time.now
t.rfc2822  

You must require ‘time’ to use this method.

Source

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);
}

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          
t.round    
t.round(0) 
t.round(1) 
t.round(2) 
t.round(3) 
t.round(4) 

t = Time.utc(1999, 12,31, 23, 59, 59)
t                
(t + 0.4).round  
(t + 0.49).round 
(t + 0.5).round  
(t + 1.4).round  
(t + 1.49).round 
(t + 1.5).round  

Related: Time#ceil, Time#floor.

Source

static VALUE
time_saturday(VALUE time)
{
    wday_p(6);
}

Source

static VALUE
time_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 for self, in range (0..60):

t = Time.new(2000, 1, 2, 3, 4, 5, 6)

t.sec 

Note: the second value may be 60 when there is a leap second.

Related: Time#year, Time#mon, Time#min.

Source

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;
    }
}

Returns a string representation of self, formatted according to the given string format. See Formats for Dates and Times.

Source

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));
}

Returns the exact subseconds for self as a Numeric (Integer or Rational):

t = Time.now 
t.subsec     

If the subseconds is zero, returns integer zero:

t = Time.new(2000, 1, 1, 2, 3, 4) 
t.subsec                          

Source

static VALUE
time_sunday(VALUE time)
{
    wday_p(0);
}

Source

static VALUE
time_thursday(VALUE time)
{
    wday_p(4);
}

Source

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));
}

Returns a 10-element array of values representing self:

Time.utc(2000, 1, 1).to_a


The returned array is suitable for use as an argument to Time.utc or Time.local to create a new Time object.

Source

static VALUE
time_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 a Date object which denotes self.

Source

static VALUE
time_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 a DateTime object which denotes self.

Source

static VALUE
time_to_f(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    return rb_Float(rb_time_unmagnify_to_float(tobj->timew));
}

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         
Time.utc(1970, 1, 1, 0, 0, 0, 999999).to_f 
Time.utc(1950, 1, 1, 0, 0, 0).to_f         
Time.utc(1990, 1, 1, 0, 0, 0).to_f         

Related: Time#to_i, Time#to_r.

Source

static VALUE
time_to_i(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE)));
}

Returns the value of self as integer Epoch seconds; subseconds are truncated (not rounded):

Time.utc(1970, 1, 1, 0, 0, 0).to_i         
Time.utc(1970, 1, 1, 0, 0, 0, 999999).to_i 
Time.utc(1950, 1, 1, 0, 0, 0).to_i         
Time.utc(1990, 1, 1, 0, 0, 0).to_i         

Related: Time#to_f Time#to_r.

Source

def to_json(*args)
  as_json.to_json(*args)
end

Returns a JSON string representing self:

require 'json/add/time'
puts Time.now.to_json

Output:

{"json_class":"Time","s":1700931678,"n":980650786}

Source

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;
}

Source

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());
}

Returns a string representation of self, without subseconds:

t = Time.new(2000, 12, 31, 23, 59, 59, 0.5)
t.to_s    

Related: Time#ctime, Time#inspect:

t.ctime   
t.inspect 

Source

static VALUE
time_to_time(VALUE self)
{
    return self;
}

Returns self.

Source

static VALUE
time_tuesday(VALUE time)
{
    wday_p(2);
}

Source

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)));
}

Also aliased as: nsec

Source

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));
}

Also aliased as: 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:

t = Time.now 
t.usec       

Related: Time#subsec (returns exact subseconds).

Returns self, converted to the UTC timezone:

t = Time.new(2000) 
t.utc?             
t.utc              
t.utc?             

Related: Time#getutc (returns a new converted Time object).

Source

static VALUE
time_utc_p(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    return RBOOL(TZMODE_UTC_P(tobj));
}

Returns true if self represents a time in UTC (GMT):

now = Time.now

now.utc? 
now.getutc.utc? 
utc = Time.utc(2000, 1, 1, 20, 15, 1)

utc.utc? 

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.

Also aliased as: gmt?

Returns the offset in seconds between the timezones of UTC and self:

Time.utc(2000, 1, 1).utc_offset   
Time.local(2000, 1, 1).utc_offset 

Source

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);
}

Returns the integer day of the week for self, in range (0..6), with Sunday as zero.

t = Time.new(2000, 1, 2, 3, 4, 5, 6)

t.wday    
t.sunday? 

Related: Time#year, Time#hour, Time#min.

Source

static VALUE
time_wednesday(VALUE time)
{
    wday_p(3);
}

Source

def xmlschema(fraction_digits=0)
  fraction_digits = fraction_digits.to_i
  s = strftime("%FT%T")
  if fraction_digits > 0
    s << strftime(".%#{fraction_digits}N")
  end
  s << (utc? ? 'Z' : strftime("%:z"))
end

Returns a string which represents the time as a dateTime defined by XML Schema:

CCYY-MM-DDThh:mm:ssTZD
CCYY-MM-DDThh:mm:ss.sssTZD

where TZD is Z or [+-]hh:mm.

If self is a UTC time, Z is used as TZD. [+-]hh:mm is used otherwise.

fraction_digits specifies a number of digits to use for fractional seconds. Its default value is 0.

require 'time'

t = Time.now
t.iso8601  

You must require ‘time’ to use this method.

Also aliased as: iso8601, iso8601

Source

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);
}

Returns the integer day of the year of self, in range (1..366).

Time.new(2000, 1, 1).yday   
Time.new(2000, 12, 31).yday 

Source

static VALUE
time_year(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    MAKE_TM(time, tobj);
    return tobj->vtm.year;
}

Source

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;
}

Returns the string name of the time zone for self:

Time.utc(2000, 1, 1).zone 
Time.new(2000, 1, 1).zone