組み込みクラス: 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"
こうなる。