みんなのちからになりたい

コピペでブログラムつくっていきたい

active_supportで日付いじるの便利

DateTimeに5分足したいとかするとき、どうしたらいいかわからなくて悩んだ。

require "date"

dt = DateTime.now
p "now -> #{dt}"

dt += 5
p "now + 5 -> #{dt}"


$ ruby datetime.rb
"now -> 2013-03-08T12:07:05+09:00"
"now + 5 -> 2013-03-13T12:07:05+09:00"

単純にDateTimeに足すと日にちに足される。

どうするかぐぐったら、Rationalで足せばいいらしい。

ruby-list jp - [ruby-list:44398] DateTimeクラスでの時間加算について

class Rational

やってみる。

require "date"

dt = DateTime.now
p "now -> #{dt}"

dt += 5
p "now + 5 -> #{dt}"

dt = DateTime.new(2013, 1, 1)
p "new -> #{dt}"

dt = dt + Rational(5, 24 * 60)
p "add 5 min -> #{dt}"

dt = dt + Rational(5, 24 * 60 * 60)
p "add 5 sec -> #{dt}"


$ ruby datetime.rb
"now -> 2013-03-08T13:16:13+09:00"
"now + 5 -> 2013-03-13T13:16:13+09:00"
"new -> 2013-01-01T00:00:00+00:00"
"add 5 min -> 2013-01-01T00:05:00+00:00"
"add 5 sec -> 2013-01-01T00:05:05+00:00"

いけた。でもめんどい。

他の方法ないかとぐぐったらいいのがあった。

Rubyで日付の計算するならactive_support使っとけ - (゚∀゚)o彡 sasata299's blog

active_supportというの使うといいらしい。
dt + 5.minuteとかかけるのやばい。
gem install active_supportして使ってみるとエラーが出る。

You don't have i18n installed in your application. Please add it to your Gemfile and run bundle install
LoadError: cannot load such file -- i18n
from C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'

よくわからないけどi18nというのがいるっぽいのでこれもgemで入れる。
すると

require "date"
require "active_support"

dt = DateTime.now
p "now -> #{dt}"

dt += 5
p "now + 5 -> #{dt}"

dt = DateTime.new(2013, 1, 1)
p "new -> #{dt}"

dt = dt + Rational(5, 24 * 60)
p "add 5 min -> #{dt}"

dt = dt + Rational(5, 24 * 60 * 60)
p "add 5 sec -> #{dt}"

dt = dt + 5.minute
p "add 5 min -> #{dt}"


$ ruby datetime.rb
"now -> 2013-03-08T13:25:04+09:00"
"now + 5 -> 2013-03-13T13:25:04+09:00"
"new -> 2013-01-01T00:00:00+00:00"
"add 5 min -> 2013-01-01T00:05:00+00:00"
"add 5 sec -> 2013-01-01T00:05:05+00:00"
datetime.rb:19:in `<main>': undefined method `minute' for 5:Fixnum (NoMethodError)

怒られる。
サンプル通りにやってるんだけどなんでかと思ってぐぐってみたら

active_supportのrequire | もっとクールにプログラミング

機能ごとにrequireするらしい。
今回はめんどいのでallでやってみる。

require "date"
require "active_support/all"

dt = DateTime.now
p "now -> #{dt}"

dt += 5
p "now + 5 -> #{dt}"

dt = DateTime.new(2013, 1, 1)
p "new -> #{dt}"

dt = dt + Rational(5, 24 * 60)
p "add 5 min -> #{dt}"

dt = dt + Rational(5, 24 * 60 * 60)
p "add 5 sec -> #{dt}"

dt = dt + 5.minute
p "add 5 min -> #{dt}"


$ ruby datetime.rb
"now -> 2013-03-08T13:27:18+09:00"
"now + 5 -> 2013-03-13T13:27:18+09:00"
"new -> 2013-01-01T00:00:00+00:00"
"add 5 min -> 2013-01-01T00:05:00+00:00"
"add 5 sec -> 2013-01-01T00:05:05+00:00"
"add 5 min -> 2013-01-01T00:10:05+00:00"

動いた。すばらしい。

今回は日付時刻だけだったけど、ほかにもいろいろ機能あるみたいなので使ってみたい。

勉強になる。