# Time

Class

A `Time` object represents a date and time:

```Time.new(2000, 1, 1, 0, 0, 0) # => 2000-01-01 00:00:00 -0600
```

Although its value can be expressed as a single numeric (see Epoch Seconds below), it can be convenient to deal with the value by parts:

```t = Time.new(-2000, 1, 1, 0, 0, 0.0)
# => -2000-01-01 00:00:00 -0600
t.year # => -2000
t.month # => 1
t.mday # => 1
t.hour # => 0
t.min # => 0
t.sec # => 0
t.subsec # => 0

t = Time.new(2000, 12, 31, 23, 59, 59.5)
# => 2000-12-31 23:59:59.5 -0600
t.year # => 2000
t.month # => 12
t.mday # => 31
t.hour # => 23
t.min # => 59
t.sec # => 59
t.subsec # => (1/2)
```

## Epoch Seconds

Epoch seconds is the exact number of seconds (including fractional subseconds) since the Unix Epoch, January 1, 1970.

You can retrieve that value exactly using method `Time.to_r`:

```Time.at(0).to_r        # => (0/1)
Time.at(0.999999).to_r # => (9007190247541737/9007199254740992)
```

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

`Time` implementation uses a signed 63 bit integer, Integer(T_BIGNUM), or `Rational`. It is a number of nanoseconds since the Epoch. The signed 63 bit integer can represent 1823-11-12 to 2116-02-20. When `Integer` or `Rational` 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(T_BIGNUM) 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.

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.

“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 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)         #=> 2002-01-01 00:00:00 -0500
Time.new(2002, 10)     #=> 2002-10-01 00:00:00 -0500
Time.new(2002, 10, 31) #=> 2002-10-31 00:00:00 -0500
```

You can pass a UTC offset:

```Time.new(2002, 10, 31, 2, 2, 2, "+02:00") #=> 2002-10-31 02:02:02 +0200
```
```zone = timezone("Europe/Athens")      # Eastern European Time, UTC+2
Time.new(2002, 10, 31, 2, 2, 2, zone) #=> 2002-10-31 02:02:02 +0200
```

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

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

```Time.at(628232400) #=> 1989-11-28 00:00:00 -0500
```

### Working with an Instance of `Time`

Once you have an instance of `Time` there is a multitude of things you can do with it. Below are some examples. For all of the following examples, we will work on the assumption that you have done the following:

```t = Time.new(1993, 02, 24, 12, 0, 0, "+09:00")
```

Was that a monday?

```t.monday? #=> false
```

What year was that again?

```t.year #=> 1993
```

Was it daylight savings at the time?

```t.dst? #=> false
```

What’s the day a year later?

```t + (60*60*24*365) #=> 1994-02-24 12:00:00 +0900
```

How many seconds was that since the Unix Epoch?

```t.to_i #=> 730522800
```

You can also do standard functions like compare two times.

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

t1 == t2 #=> false
t1 == t1 #=> true
t1 <  t2 #=> true
t1 >  t2 #=> false

Time.new(2010,10,31).between?(t1, t2) #=> true
```

## What’s Here

First, what’s elsewhere. Class `Time`:

Here, class `Time` provides methods that are useful for:

• {Creating `Time` objects}[rdoc-ref:Time@Methods+for+Creating].

• {Fetching `Time` values}[rdoc-ref:Time@Methods+for+Fetching].

• {Querying a `Time` object}[rdoc-ref:Time@Methods+for+Querying].

• {Comparing `Time` objects}[rdoc-ref:Time@Methods+for+Comparing].

• {Converting a `Time` object}[rdoc-ref:Time@Methods+for+Converting].

• {Rounding a `Time`}.

### Methods for Rounding

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) # => 2000-01-01 20:15:01 UTC
Time.at(t, in: '-23:59')            # => 1999-12-31 20:16:01 -2359
Time.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'`; see List of military time zones:

```t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
Time.at(t, in: 'A')                 # => 2000-01-01 21:15:01 +0100
Time.at(t, in: 'I')                 # => 2000-01-02 05:15:01 +0900
Time.at(t, in: 'K')                 # => 2000-01-02 06:15:01 +1000
Time.at(t, in: 'Y')                 # => 2000-01-01 08:15:01 -1200
Time.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 UTC
Time.at(t, in: -86399)              # => 1999-12-31 20:15:02 -235959
Time.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 of Timezone and TZInfo for example.

The timezone methods are:

A custom timezone class may have these instance methods, which will be called if defined:

#### `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")        #=> 2023-12-25 00:00:00 -0500
TimeWithTimezone.new("2023-12-25 America/New_York") #=> 2023-12-25 00:00:00 -0500
```

Or, using TZInfo:

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

TimeWithTZInfo.now(in: "America/New_York")          #=> 2023-12-25 00:00:00 -0500
TimeWithTZInfo.new("2023-12-25 America/New_York")   #=> 2023-12-25 00:00:00 -0500
```

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

Constants

#### VERSION

No documentation available

#### ZoneOffset

A hash of timezones mapped to hour differences from UTC. The set of time zones corresponds to the ones specified by RFC 2822 and ISO 8601.

#### MonthValue

No documentation available
Class Methods

Returns a new `Time` object based on the given arguments.

Required argument `time` may be either of:

• A `Time` object, whose value is the basis for the returned time; also influenced by optional keyword argument `in:` (see below).

• A numeric number of Epoch seconds for the returned time.

Examples:

```t = Time.new(2000, 12, 31, 23, 59, 59) # => 2000-12-31 23:59:59 -0600
secs = t.to_i                          # => 978328799
Time.at(secs)                          # => 2000-12-31 23:59:59 -0600
Time.at(secs + 0.5)                    # => 2000-12-31 23:59:59.5 -0600
Time.at(1000000000)                    # => 2001-09-08 20:46:40 -0500
Time.at(0)                             # => 1969-12-31 18:00:00 -0600
Time.at(-1000000000)                   # => 1938-04-24 17:13:20 -0500
```

Optional numeric argument `subsec` and optional symbol argument `units` work together to specify subseconds for the returned time; argument `units` specifies the units for `subsec`:

• `:millisecond`: `subsec` in milliseconds:

```Time.at(secs, 0, :millisecond)     # => 2000-12-31 23:59:59 -0600
Time.at(secs, 500, :millisecond)   # => 2000-12-31 23:59:59.5 -0600
Time.at(secs, 1000, :millisecond)  # => 2001-01-01 00:00:00 -0600
Time.at(secs, -1000, :millisecond) # => 2000-12-31 23:59:58 -0600
```
• `:microsecond` or `:usec`: `subsec` in microseconds:

```Time.at(secs, 0, :microsecond)        # => 2000-12-31 23:59:59 -0600
Time.at(secs, 500000, :microsecond)   # => 2000-12-31 23:59:59.5 -0600
Time.at(secs, 1000000, :microsecond)  # => 2001-01-01 00:00:00 -0600
Time.at(secs, -1000000, :microsecond) # => 2000-12-31 23:59:58 -0600
```
• `:nanosecond` or `:nsec`: `subsec` in nanoseconds:

```Time.at(secs, 0, :nanosecond)           # => 2000-12-31 23:59:59 -0600
Time.at(secs, 500000000, :nanosecond)   # => 2000-12-31 23:59:59.5 -0600
Time.at(secs, 1000000000, :nanosecond)  # => 2001-01-01 00:00:00 -0600
Time.at(secs, -1000000000, :nanosecond) # => 2000-12-31 23:59:58 -0600
```

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

```Time.at(secs, in: '+12:00') # => 2001-01-01 17:59:59 +1200
Time.at(secs, in: '-12:00') # => 2000-12-31 17:59:59 -1200
```

For the forms of argument `zone`, see Timezone Specifiers.

An alias for utc

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")
#=> 2011-10-06 02:26:12 UTC
```

You must require ‘time’ to use this method.

An alias for xmlschema

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

```# With seven arguments.
Time.local(0, 1, 2, 3, 4, 5, 6)
# => 0000-01-02 03:04:05.000006 -0600
# With exactly ten arguments.
Time.local(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# => 0005-04-03 02:01:00 -0600
```
An alias for local

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 # => 2021-04-24 17:27:46.0512465 -0500
```

With one string argument that represents a time, returns a new `Time` object based on the given argument, in the local timezone.

```Time.new('2000-12-31 23:59:59.5')              # => 2000-12-31 23:59:59.5 -0600
Time.new('2000-12-31 23:59:59.5 +0900')        # => 2000-12-31 23:59:59.5 +0900
Time.new('2000-12-31 23:59:59.5', in: '+0900') # => 2000-12-31 23:59:59.5 +0900
Time.new('2000-12-31 23:59:59.5')              # => 2000-12-31 23:59:59.5 -0600
Time.new('2000-12-31 23:59:59.56789', precision: 3) # => 2000-12-31 23:59:59.567 -0600
```

With one to six arguments, returns a new `Time` object based on the given arguments, in the local timezone.

```Time.new(2000, 1, 2, 3, 4, 5) # => 2000-01-02 03:04:05 -0600
```

For the positional arguments (other than `zone`):

• `year`: Year, with no range limits:

```Time.new(999999999)  # => 999999999-01-01 00:00:00 -0600
Time.new(-999999999) # => -999999999-01-01 00:00:00 -0600
```
• `month`: Month in range (1..12), or case-insensitive 3-letter month name:

```Time.new(2000, 1)     # => 2000-01-01 00:00:00 -0600
Time.new(2000, 12)    # => 2000-12-01 00:00:00 -0600
Time.new(2000, 'jan') # => 2000-01-01 00:00:00 -0600
Time.new(2000, 'JAN') # => 2000-01-01 00:00:00 -0600
```
• `mday`: Month day in range(1..31):

```Time.new(2000, 1, 1)  # => 2000-01-01 00:00:00 -0600
Time.new(2000, 1, 31) # => 2000-01-31 00:00:00 -0600
```
• `hour`: Hour in range (0..23), or 24 if `min`, `sec`, and `usec` are zero:

```Time.new(2000, 1, 1, 0)  # => 2000-01-01 00:00:00 -0600
Time.new(2000, 1, 1, 23) # => 2000-01-01 23:00:00 -0600
Time.new(2000, 1, 1, 24) # => 2000-01-02 00:00:00 -0600
```
• `min`: Minute in range (0..59):

```Time.new(2000, 1, 1, 0, 0)  # => 2000-01-01 00:00:00 -0600
Time.new(2000, 1, 1, 0, 59) # => 2000-01-01 00:59:00 -0600
```
• `sec`: Second in range (0…61):

```Time.new(2000, 1, 1, 0, 0, 0)  # => 2000-01-01 00:00:00 -0600
Time.new(2000, 1, 1, 0, 0, 59) # => 2000-01-01 00:00:59 -0600
Time.new(2000, 1, 1, 0, 0, 60) # => 2000-01-01 00:01:00 -0600
```

`sec` may be `Float` or `Rational`.

```Time.new(2000, 1, 1, 0, 0, 59.5)  # => 2000-12-31 23:59:59.5 +0900
Time.new(2000, 1, 1, 0, 0, 59.7r) # => 2000-12-31 23:59:59.7 +0900
```

These values may be:

• Integers, as above.

• Numerics convertible to integers:

```Time.new(Float(0.0), Rational(1, 1), 1.0, 0.0, 0.0, 0.0)
# => 0000-01-01 00:00:00 -0600
```
• `String` integers:

```a = %w[0 1 1 0 0 0]
# => ["0", "1", "1", "0", "0", "0"]
Time.new(*a) # => 0000-01-01 00:00:00 -0600
```

When positional argument `zone` or keyword argument `in:` is given, the new `Time` object is in the specified timezone. For the forms of argument `zone`, see Timezone Specifiers:

```Time.new(2000, 1, 1, 0, 0, 0, '+12:00')
# => 2000-01-01 00:00:00 +1200
Time.new(2000, 1, 1, 0, 0, 0, in: '-12:00')
# => 2000-01-01 00:00:00 -1200
Time.new(in: '-12:00')
# => 2022-08-23 08:49:26.1941467 -1200
```

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  # => 3600
```
• `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.

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

```Time.now               # => 2009-06-24 12:39:54 +0900
Time.now(in: '+04:00') # => 2009-06-24 07:39:54 +0400
```

For forms of argument `zone`, see Timezone Specifiers.

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") #=> 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 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)  #=> 2010-10-28 12:00:00 -0500
Time.parse("12:00", t)  #=> 2010-10-29 12:00:00 -0500
Time.parse("12:00", dt) #=> 2010-10-30 12:00:00 -0500
Time.parse("12:00", md) #=> 2010-10-31 12:00:00 -0500
```

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)}
#=> 2001-10-31 00:00:00 -0500
Time.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 of `now`. 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 -0500
Time.parse("7/23", now)      #=> 2001-07-23 00:00:00 -0500
Time.parse("Aug 31", now)    #=> 2001-08-31 00:00:00 -0500
Time.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 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.

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")
#=> 2010-10-05 22:26:12 -0400
```

You must require ‘time’ to use this method.

An alias for rfc2822

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") #=> 2000-10-31 00:00:00 -0500
```

You must require ‘time’ to use this method.

Returns a new `Time` object based the on given arguments, in the UTC timezone.

With one to seven arguments given, the arguments are interpreted as in the first calling sequence above:

```Time.utc(year, month = 1, mday = 1, hour = 0, min = 0, sec = 0, usec = 0)
```

Examples:

```Time.utc(2000)  # => 2000-01-01 00:00:00 UTC
Time.utc(-2000) # => -2000-01-01 00:00:00 UTC
```

There are no minimum and maximum values for the required argument `year`.

For the optional arguments:

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

```Time.utc(2000, 1)     # => 2000-01-01 00:00:00 UTC
Time.utc(2000, 12)    # => 2000-12-01 00:00:00 UTC
Time.utc(2000, 'jan') # => 2000-01-01 00:00:00 UTC
Time.utc(2000, 'JAN') # => 2000-01-01 00:00:00 UTC
```
• `mday`: Month day in range(1..31):

```Time.utc(2000, 1, 1)  # => 2000-01-01 00:00:00 UTC
Time.utc(2000, 1, 31) # => 2000-01-31 00:00:00 UTC
```
• `hour`: Hour in range (0..23), or 24 if `min`, `sec`, and `usec` are zero:

```Time.utc(2000, 1, 1, 0)  # => 2000-01-01 00:00:00 UTC
Time.utc(2000, 1, 1, 23) # => 2000-01-01 23:00:00 UTC
Time.utc(2000, 1, 1, 24) # => 2000-01-02 00:00:00 UTC
```
• `min`: Minute in range (0..59):

```Time.utc(2000, 1, 1, 0, 0)  # => 2000-01-01 00:00:00 UTC
Time.utc(2000, 1, 1, 0, 59) # => 2000-01-01 00:59:00 UTC
```
• `sec`: Second in range (0..59), or 60 if `usec` is zero:

```Time.utc(2000, 1, 1, 0, 0, 0)  # => 2000-01-01 00:00:00 UTC
Time.utc(2000, 1, 1, 0, 0, 59) # => 2000-01-01 00:00:59 UTC
Time.utc(2000, 1, 1, 0, 0, 60) # => 2000-01-01 00:01:00 UTC
```
• `usec`: Microsecond in range (0..999999):

```Time.utc(2000, 1, 1, 0, 0, 0, 0)      # => 2000-01-01 00:00:00 UTC
Time.utc(2000, 1, 1, 0, 0, 0, 999999) # => 2000-01-01 00:00:00.999999 UTC
```

The values may be:

• Integers, as above.

• Numerics convertible to integers:

```Time.utc(Float(0.0), Rational(1, 1), 1.0, 0.0, 0.0, 0.0, 0.0)
# => 0000-01-01 00:00:00 UTC
```
• `String` integers:

```a = %w[0 1 1 0 0 0 0 0]
# => ["0", "1", "1", "0", "0", "0", "0", "0"]
Time.utc(*a) # => 0000-01-01 00:00:00 UTC
```

When exactly ten arguments are given, the arguments are interpreted as in the second calling sequence above:

```Time.utc(sec, min, hour, mday, month, year, dummy, dummy, dummy, dummy)
```

where the `dummy` arguments are ignored:

```a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Time.utc(*a) # => 0005-04-03 02:01:00 UTC
```

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

```t = Time.new(2000, 1, 2, 3, 4, 5, 6) # => 2000-01-02 03:04:05 +000006
a = t.to_a   # => [5, 4, 3, 2, 1, 2000, 0, 2, false, nil]
Time.utc(*a) # => 2000-01-02 03:04:05 UTC
```

The two forms have their first six arguments in common, though in different orders; the ranges of these common arguments are the same for both forms; see above.

Raises an exception if the number of arguments is eight, nine, or greater than ten.

Related: `Time.local`.

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")
#=> 2011-10-05 22:26:12-04:00
```

You must require ‘time’ to use this method.

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") #=> -18000
```

You must require ‘time’ to use this method.

Instance Methods

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

```t = Time.new(2000) # => 2000-01-01 00:00:00 -0600
t + (60 * 60 * 24) # => 2000-01-02 00:00:00 -0600
t + 0.5            # => 2000-01-01 00:00:00.5 -0600
```

Related: `Time#-`.

When `numeric` is given, returns a new `Time` object whose value is the difference of the numeric value of `self` and `numeric`:

```t = Time.new(2000) # => 2000-01-01 00:00:00 -0600
t - (60 * 60 * 24) # => 1999-12-31 00:00:00 -0600
t - 0.5            # => 1999-12-31 23:59:59.5 -0600
```

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

```t - t # => 0.0
```

Related: `Time#+`.

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     # => 2007-11-19 08:12:12 -0600
t2 = t + 2592000 # => 2007-12-19 08:12:12 -0600
t <=> t2         # => -1
t2 <=> t         # => 1

t = Time.now     # => 2007-11-19 08:13:38 -0600
t2 = t + 0.1     # => 2007-11-19 08:13:38 -0600
t.nsec           # => 98222999
t2.nsec          # => 198222999
t <=> t2         # => -1
t2 <=> t         # => 1
t <=> t          # => 0
```

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
# => {"json_class"=>"Time", "s"=>1700931656, "n"=>472846644}
```

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

```Time.json_create(x)
# => 2023-11-25 11:00:56.472846644 -0600
```
An alias for ctime

Returns a new `Time` object whose numerical value is greater than or equal to `self` with its seconds truncated to precision `ndigits`:

```t = Time.utc(2010, 3, 30, 5, 43, 25.123456789r)
t          # => 2010-03-30 05:43:25.123456789 UTC
t.ceil     # => 2010-03-30 05:43:26 UTC
t.ceil(2)  # => 2010-03-30 05:43:25.13 UTC
t.ceil(4)  # => 2010-03-30 05:43:25.1235 UTC
t.ceil(6)  # => 2010-03-30 05:43:25.123457 UTC
t.ceil(8)  # => 2010-03-30 05:43:25.12345679 UTC
t.ceil(10) # => 2010-03-30 05:43:25.123456789 UTC

t = Time.utc(1999, 12, 31, 23, 59, 59)
t              # => 1999-12-31 23:59:59 UTC
(t + 0.4).ceil # => 2000-01-01 00:00:00 UTC
(t + 0.9).ceil # => 2000-01-01 00:00:00 UTC
(t + 1.4).ceil # => 2000-01-01 00:00:01 UTC
(t + 1.9).ceil # => 2000-01-01 00:00:01 UTC
```

Related: `Time#floor`, `Time#round`.

Returns a string representation of `self`, formatted by `strftime('%a %b %e %T %Y')` or its shorthand version `strftime('%c')`; see Formats for Dates and Times:

```t = Time.new(2000, 12, 31, 23, 59, 59, 0.5)
t.ctime                      # => "Sun Dec 31 23:59:59 2000"
t.strftime('%a %b %e %T %Y') # => "Sun Dec 31 23:59:59 2000"
t.strftime('%c')             # => "Sun Dec 31 23:59:59 2000"
```
```t.inspect                    # => "2000-12-31 23:59:59.5 +000001"
t.to_s                       # => "2000-12-31 23:59:59 +0000"
```
An alias for mday

Returns a hash of the name/value pairs, to use in pattern matching. Possible keys are: `:year`, `:month`, `:day`, `:yday`, `:wday`, `:hour`, `:min`, `:sec`, `:subsec`, `:dst`, `:zone`.

Possible usages:

```t = Time.utc(2022, 10, 5, 21, 25, 30)

if t in wday: 3, day: ..7  # uses deconstruct_keys underneath
puts "first Wednesday of the month"
end
#=> prints "first Wednesday of the month"

case t
in year: ...2022
puts "too old"
in month: ..9
puts "quarter 1-3"
in wday: 1..5, month:
puts "working day in month #{month}"
end
#=> prints "working day in month 10"
```

Note that deconstruction by pattern can also be combined with class check:

```if t in Time(wday: 3, day: ..7)
puts "first Wednesday of the month"
end
```
An alias for isdst

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

Returns a new `Time` object whose numerical value is less than or equal to `self` with its seconds truncated to precision `ndigits`:

```t = Time.utc(2010, 3, 30, 5, 43, 25.123456789r)
t           # => 2010-03-30 05:43:25.123456789 UTC
t.floor     # => 2010-03-30 05:43:25 UTC
t.floor(2)  # => 2010-03-30 05:43:25.12 UTC
t.floor(4)  # => 2010-03-30 05:43:25.1234 UTC
t.floor(6)  # => 2010-03-30 05:43:25.123456 UTC
t.floor(8)  # => 2010-03-30 05:43:25.12345678 UTC
t.floor(10) # => 2010-03-30 05:43:25.123456789 UTC

t = Time.utc(1999, 12, 31, 23, 59, 59)
t               # => 1999-12-31 23:59:59 UTC
(t + 0.4).floor # => 1999-12-31 23:59:59 UTC
(t + 0.9).floor # => 1999-12-31 23:59:59 UTC
(t + 1.4).floor # => 2000-01-01 00:00:00 UTC
(t + 1.9).floor # => 2000-01-01 00:00:00 UTC
```

Related: `Time#ceil`, `Time#round`.

Returns `true` if `self` represents a Friday, `false` otherwise:

```t = Time.utc(2000, 1, 7) # => 2000-01-07 00:00:00 UTC
t.friday?                # => true
```

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

```local = Time.local(2000) # => 2000-01-01 00:00:00 -0600
local.utc?               # => false
utc = local.getutc       # => 2000-01-01 06:00:00 UTC
utc.utc?                 # => true
utc == local             # => true
```

Returns a new `Time` object representing the value of `self` converted to a given timezone; if `zone` is `nil`, the local timezone is used:

```t = Time.utc(2000)                    # => 2000-01-01 00:00:00 UTC
t.getlocal                            # => 1999-12-31 18:00:00 -0600
t.getlocal('+12:00')                  # => 2000-01-01 12:00:00 +1200
```

For forms of argument `zone`, see Timezone Specifiers.

An alias for getgm
An alias for utc?
An alias for gmtoff

Returns `self`, converted to the UTC timezone:

```t = Time.new(2000) # => 2000-01-01 00:00:00 -0600
t.utc?             # => false
t.utc              # => 2000-01-01 06:00:00 UTC
t.utc?             # => true
```

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

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

```Time.utc(2000, 1, 1).utc_offset   # => 0
Time.local(2000, 1, 1).utc_offset # => -21600 # -6*3600, or minus six hours.
```

Returns the integer hash code for `self`.

Related: `Object#hash`.

Returns the integer hour of the day for `self`, in range (0..23):

```t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.hour # => 3
```

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 # => "Thu, 06 Oct 2011 02:26:12 GMT"
```

You must require ‘time’ to use this method.

Returns a string representation of `self` 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"
```

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

```t = Time.local(2000, 1, 1) # => 2000-01-01 00:00:00 -0600
t.zone                     # => "Central Standard Time"
t.dst?                     # => false
t = Time.local(2000, 7, 1) # => 2000-07-01 00:00:00 -0500
t.zone                     # => "Central Daylight Time"
t.dst?                     # => true
```
An alias for xmlschema

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) # => 2000-01-01 20:15:01 UTC
t.localtime                         # => 2000-01-01 14:15:01 -0600
```

With argument `zone` given, returns the new `Time` object created by converting `self` to the given time zone:

```t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
t.localtime("-09:00")               # => 2000-01-01 11:15:01 -0900
```

For forms of argument `zone`, see Timezone Specifiers.

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

```t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.mday # => 2
```

Returns the integer minute of the hour for `self`, in range (0..59):

```t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.min # => 4
```

Returns the integer month of the year for `self`, in range (1..12):

```t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.mon # => 1
```

Returns `true` if `self` represents a Monday, `false` otherwise:

```t = Time.utc(2000, 1, 3) # => 2000-01-03 00:00:00 UTC
t.monday?                # => true
```
An alias for mon
An alias for tv_nsec

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  # => "Wed, 05 Oct 2011 22:26:12 -0400"
```

You must require ‘time’ to use this method.

An alias for rfc2822

Returns a new `Time` object whose numeric value is that of `self`, with its seconds value rounded to precision `ndigits`:

```t = Time.utc(2010, 3, 30, 5, 43, 25.123456789r)
t          # => 2010-03-30 05:43:25.123456789 UTC
t.round    # => 2010-03-30 05:43:25 UTC
t.round(0) # => 2010-03-30 05:43:25 UTC
t.round(1) # => 2010-03-30 05:43:25.1 UTC
t.round(2) # => 2010-03-30 05:43:25.12 UTC
t.round(3) # => 2010-03-30 05:43:25.123 UTC
t.round(4) # => 2010-03-30 05:43:25.1235 UTC

t = Time.utc(1999, 12,31, 23, 59, 59)
t                # => 1999-12-31 23:59:59 UTC
(t + 0.4).round  # => 1999-12-31 23:59:59 UTC
(t + 0.49).round # => 1999-12-31 23:59:59 UTC
(t + 0.5).round  # => 2000-01-01 00:00:00 UTC
(t + 1.4).round  # => 2000-01-01 00:00:00 UTC
(t + 1.49).round # => 2000-01-01 00:00:00 UTC
(t + 1.5).round  # => 2000-01-01 00:00:01 UTC
```

Related: `Time#ceil`, `Time#floor`.

Returns `true` if `self` represents a Saturday, `false` otherwise:

```t = Time.utc(2000, 1, 1) # => 2000-01-01 00:00:00 UTC
t.saturday?              # => true
```

Returns the integer second of the minute for `self`, in range (0..60):

```t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.sec # => 5
```

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

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

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

```t = Time.now # => 2022-07-11 15:11:36.8490302 -0500
t.subsec     # => (4245151/5000000)
```

If the subseconds is zero, returns integer zero:

```t = Time.new(2000, 1, 1, 2, 3, 4) # => 2000-01-01 02:03:04 -0600
t.subsec                          # => 0
```

Returns `true` if `self` represents a Sunday, `false` otherwise:

```t = Time.utc(2000, 1, 2) # => 2000-01-02 00:00:00 UTC
t.sunday?                # => true
```

Returns `true` if `self` represents a Thursday, `false` otherwise:

```t = Time.utc(2000, 1, 6) # => 2000-01-06 00:00:00 UTC
t.thursday?              # => true
```

Returns a 10-element array of values representing `self`:

```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 to `Time.utc` or `Time.local` to create a new `Time` object.

Returns a `Date` object which denotes self.

Returns a `DateTime` object which denotes self.

Returns the value of `self` as a `Float` number Epoch seconds; subseconds are included.

The stored value of `self` is a Rational, which means that the returned value may be approximate:

```Time.utc(1970, 1, 1, 0, 0, 0).to_f         # => 0.0
Time.utc(1970, 1, 1, 0, 0, 0, 999999).to_f # => 0.999999
Time.utc(1950, 1, 1, 0, 0, 0).to_f         # => -631152000.0
Time.utc(1990, 1, 1, 0, 0, 0).to_f         # => 631152000.0
```

Related: `Time#to_i`, `Time#to_r`.

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

```Time.utc(1970, 1, 1, 0, 0, 0).to_i         # => 0
Time.utc(1970, 1, 1, 0, 0, 0, 999999).to_i # => 0
Time.utc(1950, 1, 1, 0, 0, 0).to_i         # => -631152000
Time.utc(1990, 1, 1, 0, 0, 0).to_i         # => 631152000
```

Returns a `JSON` string representing `self`:

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

Output:

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

Returns the value of `self` as a `Rational` exact number of Epoch seconds;

```Time.now.to_r # => (16571402750320203/10000000)
```

Related: `Time#to_f`, `Time#to_i`.

Returns a string representation of `self`, without subseconds:

```t = Time.new(2000, 12, 31, 23, 59, 59, 0.5)
t.to_s    # => "2000-12-31 23:59:59 +0000"
```
```t.ctime   # => "Sun Dec 31 23:59:59 2000"
t.inspect # => "2000-12-31 23:59:59.5 +000001"
```

Returns self.

Returns `true` if `self` represents a Tuesday, `false` otherwise:

```t = Time.utc(2000, 1, 4) # => 2000-01-04 00:00:00 UTC
t.tuesday?               # => true
```

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

```t = Time.now # => 2022-07-11 15:04:53.3219637 -0500
t.nsec       # => 321963700
```

Related: `Time#subsec` (returns exact subseconds).

An alias for to_i

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

```t = Time.now # => 2022-07-11 14:59:47.5484697 -0500
t.usec       # => 548469
```

Related: `Time#subsec` (returns exact subseconds).

An alias for tv_usec
An alias for gmtime

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

```now = Time.now
# => 2022-08-18 10:24:13.5398485 -0500
now.utc? # => false
utc = Time.utc(2000, 1, 1, 20, 15, 1)
# => 2000-01-01 20:15:01 UTC
utc.utc? # => true
```

Related: `Time.utc`.

An alias for gmtoff

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)
# => 2000-01-02 03:04:05 +000006
t.wday    # => 0
t.sunday? # => true
```

Returns `true` if `self` represents a Wednesday, `false` otherwise:

```t = Time.utc(2000, 1, 5) # => 2000-01-05 00:00:00 UTC
t.wednesday?             # => true
```

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  # => "2011-10-05T22:26:12-04:00"
```

You must require ‘time’ to use this method.

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

```Time.new(2000, 1, 1).yday   # => 1
Time.new(2000, 12, 31).yday # => 366
```

Returns the integer year for `self`:

```t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.year # => 2000
```

Returns the string name of the time zone for `self`:

```Time.utc(2000, 1, 1).zone # => "UTC"
Time.new(2000, 1, 1).zone # => "Central Standard Time"
```