組み込みクラス: TimeClass編

入出力は範囲が膨大な割に、扱いが非常に面倒くさそうなので、先にTimeClassと正規表現を片付けてしまう。

Timeオブジェクトの生成

new

`nowエイリアス

irb(main):029:0> Time.now
=> 2019-09-21 17:12:01 +0900
irb(main):030:0> Time.now.to_s
=> "2019-09-21 17:12:05 +0900"

at

1970年1月1日からの秒数を指定して、そのTimeオブジェクトを返す。 どんなシーンで使うのか最早想像できない。

更に細かい指定をするなら、2つ目の引数にマイクロ秒を指定する。

irb(main):031:0> Time.at(100)
=> 1970-01-01 09:01:40 +0900

mktime

localエイリアスatメソッドをもっとわかりやすい形にしたもので、与えられた引数に応じて、挙動が変わる。

引数が7個までなら、年、月、日、時、分、秒、マイクロ秒が指定できる。年は省略できないが、他を省略すると、1月1日0時0分0秒0マイクロ秒がセットされる。

irb(main):033:0> Time.local(1996,6,13,8,25)
=> 1996-06-13 08:25:00 +0900

5個しか引数を指定してないけどちゃんと生成された。

irb(main):036:0> Time.local(1996,'Jun',13,8,25)
=> 1996-06-13 08:25:00 +0900

月名の英語指定もできちゃう。

引数が10個の場合は、小さい単位から(秒から)分、時、日、月、年、まできて、曜日、年日、サマータイムの有無、タイムゾーン指定ができるが、曜日以降は無視されるらしい。 (じゃあ6個しか指定できてないじゃん???) 唯一この使い方を使うタイミングがあるとすれば、Timeを小さい単位から指定したいときぐらいかな。そんなタイミングあるんだろうか。

irb(main):040:0> Time.mktime(36,18,20,13,06,1996,4,188,true,"UCT")
=> 1996-06-13 20:18:36 +0900

わざわざUCTを指定したにも関わらず、JSTが返ってきている。

utc

エイリアスgm。引数のルールはmktime(local)と変わらないまま、世界標準時が作成できる。

irb(main):041:0> Time.utc(36,18,20,13,06,1996,4,188,true,"UCT")
=> 1996-06-13 20:18:36 UTC

Timeオブジェクトの属性を取得

基本的な属性に関しては特に面白いものはないけどmday,wdayは混乱しそう。

irb(main):042:0> birth = Time.utc(36,18,20,13,06,1996,4,188,true,"UCT")
=> 1996-06-13 20:18:36 UTC
irb(main):043:0> birth.mday
=> 13
irb(main):044:0> birth.wday
=> 4

dst?,gmt?

dstのエイリアスにはisdstが、gmtエイリアスにはutc?がある。

irb(main):047:0> birth.isdst
=> false
irb(main):048:0> birth.dst?
=> false
irb(main):053:0> birth.gmt?
=> true

gmt_offset

世界標準時との差分を秒数で返してくれる。つかうのかな?

irb(main):054:0> jtime = Time.local(1996,6,13,8,25)
=> 1996-06-13 08:25:00 +0900
irb(main):055:0> jtime.gmt_offset
=> 32400
irb(main):056:0> jtime.gmt_offset/60/60
=> 9

タイムゾーンを変更する

そうはいっても、世界標準時日本標準時間の変更しかできない。 破壊的メソッドと非破壊的メソッドは全く別名であることに注意したい。

localtime, gmtime 破壊的

gmtimeにはutcというエイリアスが設定されている。 破壊的なメソッド。

irb(main):057:0> jtime.localtime
=> 1996-06-13 08:25:00 +0900
irb(main):058:0> jtime.gmtime
=> 1996-06-12 23:25:00 UTC
irb(main):059:0> p jtime
1996-06-12 23:25:00 UTC
=> 1996-06-12 23:25:00 UTC

getlocal, getgm 破壊的なし

prefixとしてgetをつけると非破壊メソッドになる。 世界標準時の方には破壊メソッドと同じくエイリアスがあって、getutcとなる。

Timeオブジェクトの演算

+でもーでも計算可能だが、すべて秒数単位の計算となる。

Timeオブジェクトの変換

to_s

起算時からの秒数。tv_secというエイリアスが設定されている。

irb(main):060:0> p jtime.to_i
834621900
=> 834621900

カンケ―ないけど、2038年問題とはこういうことらしい。 2025年問題の次は2038年問題!コンピュータの暦問題を探る(後編) – CHANGE-MAKERS

to_a

配列に変換されるときは、先ほどの(理不尽な)10個の引数の順番で出てくる。

irb(main):062:0> jtime.to_a
=> [0, 25, 8, 13, 6, 1996, 4, 165, false, "\x{938C}\x{8B9E} (\x{9557}\x{8F80}\x{8E9E})"]

to_s

「年-月-日 時間 タイムゾーン」で出てくる。この表示をstrftimeで表示させる問題が出ているので、対応しておきたい。

irb(main):063:0> jtime.to_s
=> "1996-06-13 08:25:00 +0900"

strftime

フォーマットに指定出きる文字が様々なのでいくつか試してみる。

曜日

文字
%A 曜日
%a 曜日省略形
%w 曜日(数字)
irb(main):001:0> t = Time.now
=> 2019-09-21 18:27:06 +0900
irb(main):002:0> t.strftime("%A")
=> "Saturday"    
irb(main):003:0> t.strftime("%a")
=> "Sat"
irb(main):004:0> t.strftime("%w")
=> "6"

文字
%B 月(英語)
%a 月(省略形)
%m 月(数字)
irb(main):006:0> t.strftime("%B")
=> "September"   
irb(main):007:0> t.strftime("%b")
=> "Sep"
irb(main):008:0> t.strftime("%m")
=> "09"

曜日+月+日+時刻+年

文字
%c 日付と時刻
irb(main):009:0> t.strftime("%c")
=> "Sat Sep 21 18:27:06 2019"

此方はTime.now.to_sとは異なる曜日から始めるスタイル。

文字
%d 日付
%x 月/日付/年
%j 年の通算日
irb(main):010:0> t.strftime("%d")
=> "21"
irb(main):011:0> t.strftime("%x")
=> "09/21/19"
irb(main):012:0> t.strftime("%j")
=> "264"

時刻

文字
%H 24時間制時刻
%I 12時間制時刻
%X 時刻:分:秒
%M
%S
%p 午前午後
irb(main):013:0> t.strftime("%H")
=> "18"
irb(main):014:0> t.strftime("%I")
=> "06"
irb(main):015:0> t.strftime("%X")
=> "18:27:06"
irb(main):016:0> t.strftime("%M")
=> "27"
irb(main):017:0> t.strftime("%S")
=> "06"
irb(main):018:0> t.strftime("%p")
=> "PM"

文字
%Y 4桁年
%y 2桁年
irb(main):020:0> t.strftime("%Y")
=> "2019"
irb(main):021:0> t.strftime("%y")
=> "19"

Time.now.to_sをstrftimeを使って表すには

irb(main):005:0> p t.strftime("%Y-%m-%d %H:%M:%S %z")
"2019-09-21 18:55:58 +0900"
=> "2019-09-21 18:55:58 +0900"
irb(main):006:0> t = Time.now.to_s
=> "2019-09-21 18:57:12 +0900"

こうなる。