3

次のような方法が必要です。

def time_between(from, to)
  ***
end

time_between 10.am.of_today, 3.pm.of_today # => 1pm Time object
time_between 10.am.of_today, 3.pm.of_today # => 3pm Time object
time_between 10.am.of_today, 3.pm.of_today # => 10:30am Time object
# I mean random

ここには2つの質問があります:どのように実装するの***ですか?とどのように実装するのx.pm.of_todayですか?

4

4 に答える 4

8

ルビー1.9.3

require 'rubygems'
require 'active_support/all'

def random_hour(from, to)
  (Date.today + rand(from..to).hour + rand(0..60).minutes).to_datetime
end

puts random_hour(10, 15)
于 2013-01-01T09:22:25.810 に答える
0

これは最初の試みです:

def time_between(from, to)
  today = Date.today.beginning_of_day
  (today + from.hours)..(today + to.hours).to_a.sample
end

それは次のように機能しますが:

time_between(10, 15) # => a random time between 10 am and 3 pm

私は十分だと思いますが、私はより良い解決策を受け入れるつもりです。

于 2013-01-01T04:10:52.347 に答える
-1

ランダムなタイムスロットを取得するには、2つの時間の間の距離を計算する必要があります。その距離スパンでランダムな値を取得します。そして最後にそれをあなたの時間から追加します。

のようなもの:(しかし、私はそれをテストするつもりはありません)

def time_between(from, to)
  if from > to
    time_between(to, from)
  else
    from + rand(to - from)
  end
end

時間のDSLを作成することに関して。Railsがどのようにそれを行うかを見ることができます。しかし、あなたが望んでいるもののようなものを手に入れるために。1日の時間を表すクラスを作成するだけです。Fixnumのamまたはpm呼び出しでインスタンス化します。次に、of_today(およびその他の必要な)メソッドを記述します。

class Fixnum
  def am
    TimeWriter.new(self)
  end

  def pm
    TimeWriter.new(self + 12)
  end
end

class TimeWriter
  MINUTES_IN_HOUR = 60
  SECONDS_IN_MINUTE = 60
  SECONDS_IN_HOUR = MINUTES_IN_HOUR * SECONDS_IN_MINUTE

  def initialize hours
    @hours = hours
  end

  def of_today
    start_of_today + (hours * SECONDS_IN_HOUR)
  end

  private

  attr_reader :hours

  def start_of_today
    now = Time.now
    Time.new(now.year, now.month, now.day, 0, 0)
  end
end

24時間以上のエラー処理を追加する必要があります。

于 2013-01-01T04:43:03.240 に答える
-1

このコードは、入力として分と時間を尊重します。

require 'rubygems'
require 'active_support/all'

def random_time(from, to)
  from_arr = from.split(':')
  to_arr   = to.split(':')
  now      = Time.now
  rand(Time.new(now.year, now.month, now.day, from_arr[0], rom_arr[1])..Time.new(now.year, now.month, now.day, to_arr[0], to_arr[1]))
end

puts random_time('09:15', '18:45')

同じことを行う別の簡単な方法:

require 'rubygems'
require 'active_support/all'

def random_time(from, to)
  now      = Time.now
  rand(Time.parse(now.strftime("%Y-%m-%dT#{from}:00%z"))..Time.parse(now.strftime("%Y-%m-%dT#{to}:00%z")))
end

puts random_time('09:15', '18:45')
于 2017-06-29T10:52:26.113 に答える