web-dev-qa-db-de.com

Wie erstelle ich ein zufälliges Datum in Ruby?

Ich habe ein Modell in meiner Rails 3-Anwendung, das ein Feld date enthält:

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

Ich möchte meine Datenbank mit zufälligen Datumswerten füllen.

Was ist der einfachste Weg, ein zufälliges Datum zu generieren?

30
Misha Moroshko

Hier ist eine kleine Erweiterung der Antwort von Chris mit den optionalen Parametern from und to:

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 
58

Versuche dies:

Time.at(Rand * Time.now.to_i)
41
Chris Heald
Rand(Date.civil(1990, 1, 1)..Date.civil(2050, 12, 31))

meine Lieblingsmethode

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

dann verwenden Sie gerne

random_date = random_date_in_year(2000..2020)
13
idrinkpabst

Einfach halten ..

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

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

PS. Durch Erhöhen/Verringern des Parameters '10000' wird der verfügbare Datumsbereich geändert.

12
iGallina

Für neuere Versionen von Ruby/Rails können Sie Rand für einen Time-Bereich ❤️ verwenden.

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)

Fühlen Sie sich frei, to_date, to_datetime usw. hinzuzufügen, um sie in Ihre Lieblingsklasse zu konvertieren

Getestet auf Rails 5.0.3 und Ruby 2.3.3, aber anscheinend bei Ruby 1.9+ und Rails 3+ erhältlich

3

Hier ist auch eine (meiner Meinung nach) verbesserte Version von Mladen's Code-Snippet. Glücklicherweise kann Rubys Funktion Rand () auch Zeitobjekte verarbeiten. In Bezug auf das Date-Objekt, das beim Einfügen von Rails definiert wird, wird die Rand () -Methode überschrieben, sodass auch Date-Objects verarbeitet werden können. z.B.:

# 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

Edit: Dieser Code funktioniert nicht vor Ruby v1.9.3

3
loybert

Hier ist mein One Liner, um ein zufälliges Datum in den letzten 30 Tagen zu generieren (zum Beispiel): 

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

Funktioniert hervorragend für mein Lorem Ipsum. Offensichtlich würden Minuten und Sekunden korrigiert werden.

2
Matt

Im Folgenden wird ein zufälliges Datum und eine Uhrzeit in den letzten 3 Wochen in Ruby (sans Rails) zurückgegeben.

DateTime.now - (Rand * 21)

2
Merovex

Die schönste Lösung für mich ist:

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

Da Sie Rails verwenden, können Sie den faker gem installieren und das Modul Faker :: Date verwenden.

z.B. Folgendes generiert ein zufälliges Datum im Jahr 2018:

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

0
Yuxuan Chen

Die Antwort von Mladen ist mit einem einzigen Blick etwas schwer zu verstehen. Hier ist meine Meinung dazu.

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