0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Timeクラスを色々と使ってみる

Posted at

環境

Ruby 2.6

はじめに

システム開発をする上で、日付に関する操作は避けて通ることはできません。他言語(VBです)からRubyに移行した人からすれば、日付を扱うクラスに、Timeクラス、Dateクラス、DateTimeクラスの3種類もあることに驚いてしまいます。しかし、Ruby3.0からDateTimeクラスが非推奨となっているため、これからは、ほぼほぼ、TimeクラスとDateクラスさえ知っていればいいということになりそうです。まずは、Timeクラスの使い方について、システム開発でよく使いそうなメソッドをいくつか確認してみます。

確認

システム日付を取得する方法です。Time.nowを使っても、Time.newを使っても同じです。

test.rb
puts Time.now                                         # => 2022-10-24 15:15:53 +0900
puts Time.new                                         # => 2022-10-24 15:15:53 +0900

データ型を確認すると確かに、Time型になっています。

test.rb
puts Time.now.class                                   # => Time

Time型を文字列(String型)に変換したい場合は、to_sをしてやればOKです。

test.rb
puts Time.now.to_s.class                              # => String

取得したシステム日付にフォーマットを掛けて、年月の形式(YYYY-MM)にする場合です。注意する必要があるのが、月を%mにするところです。%Mにしてしまうと秒が取得されます。また、年を%yにすると、西暦の下2桁が取得されます。例)2022 → 22

test.rb
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型に変換する場合です。引数は、文字列でも整数型でもどちらでも使えます。

test.rb
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です。

test.rb
strymd = Time.local(2022,11,2)
endymd = Time.local(2022,11,1)
puts "strymdの方が大きい" if strymd > endymd            # => strymdの方が大きい
test.rb
strymd = Time.local(2022,11,1)
endymd = Time.local(2022,11,1)
puts "同じ日付" if strymd == endymd                     # => 同じ日付
test.rb
strymd = Time.local(2022,11,1)
endymd = Time.local(2022,11,2)
puts "endymdの方が大きい" if strymd < endymd            # => endymdの方が大きい

1桁の月日を先頭0埋めにする場合です。Time型に変換してから、month、dayメソッドで取得すると、先頭0埋めがされない形で取得されるため、注意が必要です。

test.rb
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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?