- 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}")
実行すると以下のような結果が得られます。
2024-12-22 18:18:17 +0900
2024年12月22日 18:18:17
2024年12月22日 18:18:17
2024-12-22 18:18:17 +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"))
というソースを書いて実行すると以下のような結果が得られます。
/home/hogehoge/lang/ruby/datetime/strftime.rb:5:in `local': mon out of range (ArgumentError)
afterm = Time::mktime(now.year, now.mon+1, now.mday, now.hour, now.min, now.sec);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
from /home/hogehoge/lang/ruby/datetime/strftime.rb:5:in `<main>'
[02] 2024年12月22日 18:18:17
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
|