やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

組込ライブラリ(Time)

 時刻。

成果物

情報源

Time

時刻を表すクラスです。

Time.now は現在の時刻を返します。 File.mtime などが返すファイルのタイムスタンプは Time オブジェクトです。

Time オブジェクトは時刻を起算時からの経過秒数で保持しています。起算時は協定世界時(UTC、もしくはその旧称から GMT とも表記されます) の 1970年1月1日午前0時です。なお、うるう秒を勘定するかどうかはシステムによります。

 いわゆるエポックタイム。エポック秒UNIX秒。

Time オブジェクトが格納可能な時刻の範囲は環境によって異なっていましたが、 Ruby 1.9.2 からは OS の制限の影響を受けません。

また、Time オブジェクトは協定世界時と地方時のどちらのタイムゾーンを使用するかのフラグを内部に保持しています。タイムゾーンのフラグは Marshal データに保持されます。

p Marshal.load(Marshal.dump(Time.now.gmtime)).zone
# => "UTC"

time ライブラリによって、Time.parse, Time.rfc2822, Time.httpdate, Time.iso8601 等が拡張されます。

Ruby 1.9.2 以降の Time クラスのデザインの詳細は https://staff.aist.go.jp/tanaka-akira/pub/sapporo-rubykaigi-02-akr-2009.pdf や「APIデザインケーススタディ」(https://gihyo.jp/book/2016/978-4-7741-7802-8) の第4章を参照してください。

localtime(3) も参照してください。

C 言語との違いに注意

C 言語の tm 構造体とは異なり、month は 1 月に対して 1 を返し、year は 1998 年に対して 1998 を返します。また、 yday は 1 から数えます。

メンバ抜粋

特異メソッド

at gm local mktime new now utc

インスタンスメソッド

+ - <=> asctime ceil ctime day dst? eql? floor friday? getgm getlocal getutc gmt? gmt_offset gmtime gmtoff hash hour inspect isdst localtime mday min mon monday? month nsec round saturday? sec strftime subsec sunday? thursday? to_a to_f to_i to_r to_s tuesday? tv_nsec tv_sec tv_usec usec utc utc? utc_offset wday wednesday? yday year zone
メソッド 概要
now,new 現在時刻
local,mktime,new 地方時
gm,utc 協定世界時

new, now

new -> Time
now -> Time
new(year, mon = nil, day = nil, hour = nil, min = nil, sec = nil, zone = nil) -> Time
p Time.now # => 2009-06-24 12:39:54 +0900
p Time.new(2008, 6, 21, 13, 30, 0, "+09:00") # => 2008-06-21 13:30:00 +0900

at

at(time) -> Time
at(time, in:) -> Time
at(time, usec) -> Time
at(time, usec, in:) -> Time
at(seconds, xseconds, unit) -> Time
at(seconds, xseconds, unit, in:) -> Time
Time.at(0)                                # => 1970-01-01 09:00:00 +0900
Time.at(Time.at(0))                       # => 1970-01-01 09:00:00 +0900
Time.at(Time.at(0).getutc)                # => 1970-01-01 00:00:00 UTC
Time.at(946702800)                        # => 2000-01-01 14:00:00 +0900
Time.at(-284061600)                       # => 1960-12-31 15:00:00 +0900
Time.at(946684800.2).usec                 # => 200000
Time.at(1582721899, in: "+09:00")         # => 2020-02-26 21:58:19 +0900
Time.at(1582721899, in: 9*60*60)          # => 2020-02-26 21:58:19 +0900
Time.at(1582721899, in: "UTC")            # => 2020-02-26 12:58:19 UTC
Time.at(1582721899, in: "C")              # => 2020-02-26 13:58:19 +0300
Time.at(946684800, 123456.789).nsec  # => 123456789
Time.at(946684800, 123.456789, :millisecond).nsec  # => 123456789
Time.at(946684800, 123456.789, :usec).nsec         # => 123456789
Time.at(946684800, 123456.789, :microsecond).nsec  # => 123456789
Time.at(946684800, 123456789, :nsec).nsec          # => 123456789

gm, utc

gm(year, mon = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0) -> Time
utc(year, mon = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0) -> Time
gm(sec, min, hour, mday, mon, year, wday, yday, isdst, zone) -> Time
utc(sec, min, hour, mday, mon, year, wday, yday, isdst, zone) -> Time
p Time.gm(2000, 1, 1)  # => 2000-01-01 00:00:00 UTC
p Time.utc(2000, 1, 1)  # => 2000-01-01 00:00:00 UTC

local, mktime

local(year, mon = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0) -> Time
mktime(year, mon = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0) -> Time
local(sec, min, hour, mday, mon, year, wday, yday, isdst, zone) -> Time
mktime(sec, min, hour, mday, mon, year, wday, yday, isdst, zone) -> Time
p Time.local(2000, 1, 1) # => 2000-01-01 00:00:00 +0900
p Time.mktime(2000, 1, 1) # => 2000-01-01 00:00:00 +0900

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux