facets/time 解説 (Ruby Facets)

膨大な数の拡張メソッドが収録されているRuby Facets。現時点で日本語のドキュメントが存在しないため、普通は英語のドキュメントを解読していくことになるのですが、メソッドを一つ一つ解読していくのは大変です。そこでこのblogでは、私的なメモも兼ねて、Ruby Facetsに収録されたライブラリを日本語で解説していきます。

第1回はTimeクラスを拡張する facets/time です。Ruby Facets 2.8.1に準拠しています。

駆け足紹介(クイックツアー)

require 'facets/time'

# Time.elapse: ブロックの実行時間を計測する
p Time.elapse{ sleep(1) }  # => 1.07800006866455


time = Time.now
p time  # => Sat Jan 30 21:41:42 +0900 2010

# hence, ago: 時間を進めたり戻したりできる
p time.hence(5, :days)  # => Thu Feb 04 21:41:42 +0900 2010
p time.ago(2, :weeks)   # => Sat Jan 16 21:41:42 +0900 2010


# change: 時刻のうち一部だけを書き換える
p time.change(:day => 2, :minute => 30) #=> Sat Jan 02 21:41:42 +0900 2010


# trunc, round: 時刻を指定した単位(秒)で丸める
#               60 なら1分単位、60 * 60 なら1時間単位
p time.trunc(60)       # => Sat Jan 30 21:41:00 +0900 2010
p time.trunc(60 * 60)  # => Sat Jan 30 21:00:00 +0900 2010
p time.round(60)       # => Sat Jan 30 21:42:00 +0900 2010
p time.round(60 * 60)  # => Sat Jan 30 22:00:00 +0900 2010


# stamp: 時刻を指定したフォーマットで文字列化
p time.stamp(:short)  # => "30 Jan 21:41"
p time.stamp(:time)   # => "21:41"
p time.stamp(:number) # => "20100130214142"
p time.stamp(:db)     # => "2010-01-30 21:41:42"

p Time.stamp(:db)     # Time.now.stamp(:db)と同じ

クラスメソッド

Time.elapse { ... }

ブロックの実行時間を計測し、結果をFloatで返す(Benchmark.realtime と同じ)。

require 'facets/time/elapse'

Time.elapse { sleep 1 }  #=> 0.999188899993896

Time.stamp(fmt)

Time.now.stamp(fmt) と同じ。詳しくはstampメソッドを参照。

インスタンスメソッド

advance(options)

ActiveSupportの Time#advance と同じ。

ago(number, units=:seconds)

hence(number, units=:seconds)

agoなら時間を戻し、henceなら時間を進めた、新しいTimeオブジェクトを生成して返す。 動かす量は数値(number)と単位(units)の組み合わせで指定でき、単位には :seconds, :minutes, :hours, :days, :weeks, :months, :years のいずれかを指定できる。

require 'facets/time/ago'
require 'facets/time/hence'

time = Time.now
p time                     # => Sat Jan 30 18:59:29 +0900 2010
p time.hence(5)            # => Sat Jan 30 18:59:34 +0900 2010
p time.hence(5, :seconds)  # 上の例と同じ
p time.hence(30, :minutes) # => Sat Jan 30 19:29:29 +0900 2010
p time.hence(7, :days)     # => Sat Feb 06 18:59:29 +0900 2010
p time.ago(3, :weeks)      # => Sat Jan 09 18:59:29 +0900 2010

numberに負の数(-20)を指定した場合には、逆方向のメソッドが呼び出される。

time.hence(-10) # time.ago(10) と同じ

change(options)

時刻を部分的に変更した、新しいTimeオブジェクトを生成して返す。 「年だけを2009年に変更」「時間を13時30分に変更」などの処理が可能。

時間(:hour)、分(:minute)、秒(:second)を変更した場合、それより下の時間要素は0に設定される。 たとえば「15時30分」であるTimeオブジェクトに対して、changeで時間だけを13時に変更すると、時刻は「13時00分」となる。

require 'facets/time/change'

time = Time.now
p time                                    # => Sat Jan 30 20:45:12 +0900 2010
p time.change(:year => 2000, :month => 3) # => Thu Mar 30 20:45:38 +0900 2000
p time.change(:hour => 23)                # => Sat Jan 30 23:00:00 +0900 2010

round(amount)

時刻をamount秒単位で丸めた、新しいTimeオブジェクトを生成して返す。 たとえばamountが60であれば、時刻を1分単位で割り、四捨五入のように近いほうの時刻へ丸める。

近いほうの時刻にするのではなく切り捨てたい場合には、truncメソッドを使う。

require 'facets/time/round'

time = Time.now
p time                     # => Sat Jan 30 20:57:56 +0900 2010
p time.round(60)           # => Sat Jan 30 20:58:00 +0900 2010
p time.round(60 * 60)      # => Sat Jan 30 21:00:00 +0900 2010

set(options)

changeメソッドと同じだが、時間・分・秒を変更しても、その下の時間要素を0にしない。

stamp(fmt = nil)

時刻を指定したフォーマットの文字列に整形する。fmtはフォーマットの種類を表すSymbol。

require 'facets/time/stamp'

time = Time.now
p time.stamp(:short) # => "30 Jan 18:18"
p time.stamp(:long) # => "January 30, 2010 18:18"
p time.stamp(:time) # => "18:18"
p time.stamp(:number) # => "20100130181814"
p time.stamp(:utc) # =>"2010-01-30 18:18:14"

使用可能なフォーマットとその内容については、Time::FORMAT定数を見れば確認できる。

require 'facets/time/stamp'

p Time::FORMAT.class # => Hash
p Time::FORMAT.keys  # => [:datbase, :day1st, :utc, nil, :long, :number, :dmYHM, :short, :rfc822, :db, :time, :dbase]
p Time::FORMAT[:db]  # => "%Y-%m-%d %H:%M:%S"

なお、Symbolではなく文字列を引数にすると、Time#strftimeとほぼ同じ動作を行う。

trunc(amount)

時刻をamount秒単位で切り捨てた、新しいTimeオブジェクトを生成して返す。たとえばamountが60であれば、時刻を1分単位で割り、余り(秒)は切り捨てる。

切り捨てでなく近いほうの時刻にしたい場合には、roundメソッドを使う。

require 'facets/time/trunc'

time = Time.now
p time                     # => Sat Jan 30 20:57:56 +0900 2010
p time.trunc(60)           # => Sat Jan 30 20:57:00 +0900 2010
p time.trunc(60 * 60)      # => Sat Jan 30 20:00:00 +0900 2010

コメント

1 : jonn1

DHv0Eu comment6, <a href="http://blog.meta.ua/~ramon22/posts/i669460/">скидки на шины</a>, [url="http://blog.meta.ua/~ramon22/posts/i669460/"]скидки на шины[/url], http://blog.meta.ua/~ramon22/posts/i669460/ скидки на шины, cepgay,

2010年10月16日(土) 17:52

2 : intatstusly

индивидуалки элитные

праститутки николаева

<a href=http://baharevfofeze.narod.ru/cat4/>краснодар индивидуалки</a>

азиатки досуг

2011年6月2日(木) 19:57
このコメントを編集/削除

3 : laltiepeBed

<a href=http://idimka.ru/%d0%bf%d1%80%d0%be%d0%b4%d0%b2%d0%b8%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5_%d0%bd%d0%b5%d0%b8%d0%b7%d0%b1%d0%b5%d0%b6%d0%bd%d0%be>Продвижение неизбежно</a> и это факт!

2011年6月9日(木) 7:12
このコメントを編集/削除

4 : Faltvetly

диета екатерины стриженовой
диета после операции язвы желудка
боксерская диета

<a href=http://aionelas.ru/cat2/4-gruppa-krovi-dieta.html>4 группа крови диета</a>

диета моэрмана
диета елены малышевой

2011年6月20日(月) 22:56
このコメントを編集/削除

5 : Scotammandeno

При этом, нередко не уступая им в потенциале статического электричества пластика.
<a href=http://bellion.narod.ru/dieta/dieta-natashi-korolevoy.html>Диета наташи королевой</a>

2011年7月3日(日) 6:33
このコメントを編集/削除

6 : abillesiash

подагра лечение диета

3 х дневная диета

<a href=http://ek-tur.ru/category1/meditsinskaya-dieta-5.html>медицинская диета 5</a>

недорогая диета

2011年7月16日(土) 16:27
このコメントを編集/削除

7 : монтаж металлоконструкций

Браво, ваша мысль пригодится

2011年8月19日(金) 17:53
このコメントを編集/削除

8 : tours in Russia

非常に効率的に情報を書き込む。それはおそらく私を含めて、それをusess誰にも価値が出てきます。良い仕事を維持する - 正のために私はより多くのポストをチェックアウトします。

2011年8月23日(火) 9:40
このコメントを編集/削除

9 : age

女ヤッて金もらえるの?+.(・∀・).+♪ http://ylm.me/

2011年11月29日(火) 9:07

10 : SeeddyWib

[img]http://img0.liveinternet.ru/images/attach/c/2/74/612/74612862_vodka1.jpg[/img]

ЗДАРОВА ЗАЙЦЫ - ЭТО Я ВАШ ДЕД МАЗАЙ

[url=http://alkotest.da/]Написать Деду МАЗАЮ письмо[/url]

2012年1月20日(金) 16:56
このコメントを編集/削除

この記事にコメントする

(空欄可)

(blog上では公開されません。空欄可)

 (コメントの編集・削除に必要になります。半角英数4~16文字、空欄可)


この記事の情報