web-dev-qa-db-ja.com

Rubyでランダムな日付を生成する方法は?

Rails 3アプリケーションにdateフィールドを持つモデルがあります:

class CreateJobs < ActiveRecord::Migration
  def self.up
    create_table :jobs do |t|
      t.date "job_date", :null => false
      ...
      t.timestamps
    end
  end
  ...
end

ランダムな日付値をデータベースに事前入力します。

ランダムな日付を生成する最も簡単な方法は何ですか?

37
Misha Moroshko

オプションのfromおよびtoパラメータを使用して、Chrisの回答を少し拡張します。

def time_Rand from = 0.0, to = Time.now
  Time.at(from + Rand * (to.to_f - from.to_f))
end

> time_Rand
 => 1977-11-02 04:42:02 0100 
> time_Rand Time.local(2010, 1, 1)
 => 2010-07-17 00:22:42 0200 
> time_Rand Time.local(2010, 1, 1), Time.local(2010, 7, 1)
 => 2010-06-28 06:44:27 0200 
64

これを試して:

Time.at(Rand * Time.now.to_i)
44
Chris Heald

シンプルに保つ.

Date.today-Rand(10000) #for previous dates

Date.today+Rand(10000) #for future dates

PS。 「10000」パラメータを増減すると、使用可能な日付の範囲が変更されます。

16
iGallina
Rand(Date.civil(1990, 1, 1)..Date.civil(2050, 12, 31))

私の好きな方法

def random_date_in_year(year)
  return Rand(Date.civil(year.min, 1, 1)..Date.civil(year.max, 12, 31)) if year.kind_of?(Range)
  Rand(Date.civil(year, 1, 1)..Date.civil(year, 12, 31))
end

それから

random_date = random_date_in_year(2000..2020)
14
idrinkpabst

Ruby/Railsの最近のバージョンでは、Randの範囲でTimeを使用できます❤️!!

min_date = Time.now - 8.years
max_date = Time.now - 1.year
Rand(min_date..max_date)
# => "2009-12-21T15:15:17.162+01:00" (Time)

自由に追加してくださいto_dateto_datetimeなどをお気に入りのクラスに変換します

Rails 5.0.3およびRuby 2.3.3でテストされていますが、Ruby 1.9+およびRails 3+

5

以下は、過去3週間のランダムな日時をRuby(sans Rails)で返します。

DateTime.now - (Rand * 21)

4
Merovex

ここにも、Mladenのコードスニペットの(私の意見では)より改善されたバージョンがあります。幸いにも、RubyのRand()関数はTime-Objectsも処理できます。 Railsを含めるときに定義されるDateオブジェクトについては、Rand()メソッドが上書きされるため、Dateオブジェクトも処理できます。例えば。:

# works even with basic Ruby
def random_time from = Time.at(0.0), to = Time.now
  Rand(from..to)
end

# works only with Rails. syntax is quite similar to time method above :)
def random_date from = Date.new(1970), to = Time.now.to_date
  Rand(from..to)
end

編集:このコードはRuby v1.9.3以前では機能しません。

3
loybert

私にとって最もきれいな解決策は:

Rand(1.year.ago..50.weeks.from_now).to_date
3
Markus Andreas

これが、過去30日間にランダムな日付を生成するための1つの例です(たとえば)。

Time.now - (0..30).to_a.sample.days - (0..24).to_a.sample.hours

私のlorem ipsumに最適です。明らかに分と秒は修正されます。

2
Matt

Railsを使用しているので、faker gemをインストールして Faker :: Date モジュールを利用できます。

例えば以下は、2018年にランダムな日付を生成します。

Faker::Date.between(Date.parse('01/01/2018'), Date.parse('31/12/2018'))

0
Yuxuan Chen

Mladenの答えは、一見しただけでは理解するのが少し難しいです。これが私の見解です。

def time_Rand from=0, to= Time.now
  Time.at(Rand(from.to_i..to.to_i))
end
0
dhaliman