環境
Ruby 2.6
はじめに
システム開発をする上で、日付に関する操作は避けて通ることはできません。他言語(VBです)からRubyに移行した人からすれば、日付を扱うクラスに、Timeクラス、Dateクラス、DateTimeクラスの3種類もあることに驚いてしまいます。しかし、Ruby3.0からDateTimeクラスが非推奨となっているため、これからは、ほぼほぼ、TimeクラスとDateクラスさえ知っていればいいということになりそうです。まずは、Timeクラスの使い方について、システム開発でよく使いそうなメソッドをいくつか確認してみます。
確認
システム日付を取得する方法です。Time.nowを使っても、Time.newを使っても同じです。
puts Time.now # => 2022-10-24 15:15:53 +0900
puts Time.new # => 2022-10-24 15:15:53 +0900
データ型を確認すると確かに、Time型になっています。
puts Time.now.class # => Time
Time型を文字列(String型)に変換したい場合は、to_sをしてやればOKです。
puts Time.now.to_s.class # => String
取得したシステム日付にフォーマットを掛けて、年月の形式(YYYY-MM)にする場合です。注意する必要があるのが、月を%mにするところです。%Mにしてしまうと秒が取得されます。また、年を%yにすると、西暦の下2桁が取得されます。例)2022 → 22
puts Time.now.year.to_s + "-" + Time.now.month.to_s # => 2022-10
puts Time.now.strftime("%Y-%m") # => 2022-10
puts Time.now.strftime("20" + "%y-%m") # => 2022-10
文字列からTime型に変換する場合です。引数は、文字列でも整数型でもどちらでも使えます。
puts Time.local("2022","10") # => 2022-10-01 00:00:00 +0900
puts Time.local("2022","10","21") # => 2022-10-21 00:00:00 +0900
puts Time.local(2022,11) # => 2022-11-01 00:00:00 +0900
puts Time.local(2022,11,10) # => 2022-11-10 00:00:00 +0900
日付の大小比較をするときは、日付を整数型に置き換えて行うこともできますが、Time型のままで大小を行ってもOKです。
strymd = Time.local(2022,11,2)
endymd = Time.local(2022,11,1)
puts "strymdの方が大きい" if strymd > endymd # => strymdの方が大きい
strymd = Time.local(2022,11,1)
endymd = Time.local(2022,11,1)
puts "同じ日付" if strymd == endymd # => 同じ日付
strymd = Time.local(2022,11,1)
endymd = Time.local(2022,11,2)
puts "endymdの方が大きい" if strymd < endymd # => endymdの方が大きい
1桁の月日を先頭0埋めにする場合です。Time型に変換してから、month、dayメソッドで取得すると、先頭0埋めがされない形で取得されるため、注意が必要です。
y = 2022; m = 1; d = 3
puts y.to_s + format("%02d", m) + format("%02d", d) # => 20220103
puts Time.local(y, m, d).strftime("%Y%m%d") # => 20220103
ymd = Time.local(y, m, d)
puts ymd.year.to_s + ymd.month.to_s + ymd.day.to_s # => 202213