Best way to create random DateTime in Rails

前端 未结 12 1931
粉色の甜心
粉色の甜心 2020-12-22 23:49

What is the best way to generate a random DateTime in Ruby/Rails? Trying to create a nice seeds.rb file. Going to use it like so:

 Foo.create(name: Faker::Lo         


        
相关标签:
12条回答
  • 2020-12-23 00:29

    You are using Faker; why not use one of the methods provided by Faker::Date?

    # Random date between dates
    # Keyword arguments: from, to
    Faker::Date.between(from: 2.days.ago, to: Date.today) #=> "Wed, 24 Sep 2014"
    
    # Random date between dates except for certain date
    # Keyword arguments: from, to, excepted
    Faker::Date.between_except(from: 1.year.ago, to: 1.year.from_now, excepted: Date.today) #=> "Wed, 24 Sep 2014"
    
    # Random date in the future (up to maximum of N days)
    # Keyword arguments: days
    Faker::Date.forward(days: 23) # => "Fri, 03 Oct 2014"
    
    # Random date in the past (up to maximum of N days)
    # Keyword arguments: days
    Faker::Date.backward(days: 14) #=> "Fri, 19 Sep 2014"
    
    # Random birthday date (maximum age between 18 and 65)
    # Keyword arguments: min_age, max_age
    Faker::Date.birthday(min_age: 18, max_age: 65) #=> "Mar, 28 Mar 1986"
    
    # Random date in current year
    Faker::Date.in_date_period #=> #<Date: 2019-09-01>
    
    # Random date for range of year 2018 and month 2
    # Keyword arguments: year, month
    Faker::Date.in_date_period(year: 2018, month: 2) #=> #<Date: 2018-02-26>
    
    # Random date for range of current year and month 2
    # Keyword arguments: month
    Faker::Date.in_date_period(month: 2) #=> #<Date: 2019-02-26>
    

    current Faker version: 2.11.0

    0 讨论(0)
  • 2020-12-23 00:30

    Here are set of methods for generating a random integer, amount, time/datetime within a range.

    def rand_int(from, to)
      rand_in_range(from, to).to_i
    end
    
    def rand_price(from, to)
      rand_in_range(from, to).round(2)
    end
    
    def rand_time(from, to=Time.now)
      Time.at(rand_in_range(from.to_f, to.to_f))
    end
    
    def rand_in_range(from, to)
      rand * (to - from) + from
    end
    

    Now you can make the following calls.

    rand_int(60, 75)
    # => 61
    
    rand_price(10, 100)
    # => 43.84
    
    rand_time(2.days.ago)
    # => Mon Mar 08 21:11:56 -0800 2010
    
    0 讨论(0)
  • 2020-12-23 00:32

    other way:

    (10..20).to_a.sample.years.ago
    
    0 讨论(0)
  • 2020-12-23 00:33

    As I already mentioned in another question I think the following code-snippet is more consisent regarding the data-types of the parameters and of the value to be returned. Stackoverflow: How to generate a random date in Ruby?

    Anyway this uses the rand() method's internal logic what is the random Date or random Time within a span. Maybe someone has a more efficient way to set the default-parameter to (Time.now.to_date) of the method random_date, so it doesn't need this typecasting.

    def random_time from = Time.at(0.0), to = Time.now
      rand(from..to)
    end
    
    # works quite similar to date :)
    def random_date from = Date.new(1970), to = Time.now.to_date
      rand(from..to)
    end
    

    Edit: this code won't work before ruby v1.9.3

    0 讨论(0)
  • 2020-12-23 00:37

    Here is how to create a date in this month:

    day = 1.times.map{ 0+Random.rand(30) }.join.to_i  
    rand(day.days).ago
    
    0 讨论(0)
  • 2020-12-23 00:41

    Another approach using DateTime's advance

    def rand_date
      # return a random date within 100 days of today in both past and future directions.
      n = rand(-100..100)
      Date.today.advance(days: n)
    end
    
    0 讨论(0)
提交回复
热议问题