ruby - 基本的な文法 - Time 日付と時刻

 
1. 概要
2. 現在 now
3. 演算
4. 書式出力 strftime
5. 文字列を日時に strptime

1. 概要

 Time クラスで日付と時刻を扱うようです。

2. 現在 now

 now で現在日時をローカルで取得するようです。  下記のソースを書いて
now = Time::now()
puts("#{now}")
puts("#{now.year}年#{now.mon}月#{now.day}日 #{now.hour}:#{now.min}:#{now.sec}")
puts(sprintf("%04d年%02d月%02d日 %02d:%02d:%02d", now.year, now.mon, now.day, now.hour, now.min, now.sec))
puts("#{now.to_s}")

 実行すると以下のような結果が得られます。
2018-12-13 08:23:27 +0900
2018年12月13日 8:23:27
2018年12月13日 08:23:27
2018-12-13 08:23:27 +0900

3. 演算

 知りたかったのは、減算ですが。  普通に演算できるようです。  演算の結果は Float となる(単位は秒)ようで、書式化するのには工夫がいるようです。  下記のソースを書いて
#!/usr/bin/env ruby

time1 = Time::now();

sleep(60)

time2 = Time::now();

puts("時刻1 [#{time1}]")
puts("時刻2 [#{time2}]")
puts("差     [#{time2-time1}]")

diff = (time2 - time1).to_i
hour = diff/(60*60)
diff -= hour * (60*60)
min = diff/60
sec = diff - (min * 60)

puts(sprintf("%d:%02d:%02d", hour, min, sec))


 実行すると以下のような結果が得られます。

時刻1 [2018-08-02 15:49:13 +0900]
時刻2 [2018-08-02 15:50:13 +0900]
差     [60.162065836]
0:01:00
 熟知していれば、もっとスマートなソースが書けるんでしょうね。

4. 書式出力 strftime

 strftime というメソッドを使用すれば、書式付きで出力できます。  「class Time (Ruby 2.5.0)」に詳細が記述されています。  ここはマニュアルではないので、わたしの使うものだけ・・・。
書式 出力
%H 24時間制の時(00-23)
%M 分(00-59)
%S 秒(00-60) (60はうるう秒)
%d 日(01-31)
%m 月(01-12)
%Y 西暦4桁



now = Time::now()
puts("[#{sprintf("%02d", __LINE__)}] "+now.strftime("%Y年%m月%d日 %H:%M:%S"))

aftery = Time::mktime(now.year+1, now.mon, now.mday, now.hour, now.min, now.sec);
afterm = Time::mktime(now.year, now.mon+1, now.mday, now.hour, now.min, now.sec);
afterd = Time::mktime(now.year, now.mon, now.mday+1, now.hour, now.min, now.sec);
afterh = Time::mktime(now.year, now.mon, now.mday, now.hour+1, now.min, now.sec);
afteri = Time::mktime(now.year, now.mon, now.mday, now.hour, now.min+1, now.sec);
afters = Time::mktime(now.year, now.mon, now.mday, now.hour, now.min, now.sec+1);

puts("[#{__LINE__}] "+aftery.strftime("%Y年%m月%d日 %H:%M:%S"))
puts("[#{__LINE__}] "+afterm.strftime("%Y年%m月%d日 %H:%M:%S"))
puts("[#{__LINE__}] "+afterd.strftime("%Y年%m月%d日 %H:%M:%S"))
puts("[#{__LINE__}] "+afterh.strftime("%Y年%m月%d日 %H:%M:%S"))
puts("[#{__LINE__}] "+afteri.strftime("%Y年%m月%d日 %H:%M:%S"))
puts("[#{__LINE__}] "+afters.strftime("%Y年%m月%d日 %H:%M:%S"))


 というソースを書いて実行すると以下のような結果が得られます。
/usr/home/hogehoge/lang/ruby/datetime/strftime.rb:5:in `mktime': mon out of range (ArgumentError)
	from /usr/home/hogehoge/lang/ruby/datetime/strftime.rb:5:in `<main>'
[02] 2018年12月13日 08:23:27

5. 文字列を日時に strptime

 前項の逆で文字列を日時に変換するには strptime を使うようです。  本項は「Rubyで文字列を日時に変換する方法 - maeharinの日記」を参考にさせていただきました。
require 'date'

datetime = DateTime.strptime('1961年05月04日 08:12:45', "%Y年%m月%d日 %H:%M:%S")
puts("[#{sprintf("%02d", __LINE__)}] "+datetime.strftime("%Y年%m月%d日 %H:%M:%S"))

 というソースを書いて実行すると以下のような結果が得られます。
[04] 1961年05月04日 08:12:45