34

Time.nowお店の営業時間と閉店時間の間にあるかどうかを確認するメソッドを書く必要があります。

開店時間と閉店時間は Time オブジェクトとして保存されますが、正確に比較することはできません2012/2/2.

2012-02-02 02:30:00 UTC

となり、次のTime.nowようになります。

07:23 +0200

日付部分なしで時間部分だけを比較するにはどうすればよいですか?

4

8 に答える 8

38

Timeたとえば、次のように、日付部分なしでを比較できます。

time1.utc.strftime( "%H%M%S%N" ) <= time2.utc.strftime( "%H%M%S%N" )
于 2014-01-24T13:58:29.530 に答える
4

これを行う素敵なライブラリhttps://github.com/bokmann/business_timeがあります。

BusinessTime::Config.with(beginning_of_workday: "8:30 am", end_of_workday: "5:30 pm") do
  Time.now.during_business_hours?
end

次または前の営業時間への時間のローリング、2 つのタイムスタンプ間の営業時間のカウントなど、より多くのことができます。

于 2018-10-05T11:28:29.010 に答える
3

Time を時間、分、秒に分解できます。

Time Classで説明されているように:

t = Time.now
hour = t.hour
minute = t.min
seconds = t.sec

2時間以内かどうかを比較するだけなので、以下のように確認できます。

if hour > openingHour and hour < closingHour
于 2013-01-15T00:25:55.193 に答える
3

次のような日付部分なしでレールの時間のみを比較できますpost_reviewpost_reviewcreated_at

post_review.where("(created_at::time >= :start_time) AND (created_at::time <= :end_time)", 
    start_time: Time.parse("10 am").strftime("%r"),
    end_time:   Time.parse("5 pm").strftime("%r")
 )
于 2015-04-06T09:57:52.187 に答える
2

時刻を数値に変換して、曜日を削除してみてください。時間は UNIX エポックからの秒数として表され、10 進数は 1 秒の端数であるため、この数値を日数に変換して、端数を 1 日の端数にすることができます。

日ベースの数値 = Ruby Time 数値 / 60 / 60 / 24

次に、モジュラス演算子を使用して日の部分を取り除くことができるので、比較するために残っているのは時間だけです。したがって、次のようなものが必要です。

def is_open?(time)
  open_h=Time.parse('2012-02-02 02:30:00 UTC')
  close_h=Time.parse('2012-02-02 10:00:00 UTC')
  (((time.to_r / 60 / 60 / 24) % 1) >= ((open_h.to_r / 60 / 60 / 24) % 1)) && (((time.to_r / 60 / 60 / 24) % 1) <= ((close_h.to_r / 60 / 60 / 24) % 1))
end

is_open? (Time.parse('2013-01-01 09:58:00 UTC'))
=> true
is_open? (Time.parse('2013-01-01 12:58:00 UTC'))
=> false
于 2015-02-16T16:39:05.093 に答える
-1
close_or_open_time_object.to_a.first(3).reverse <=> Time.now.to_a.first(3).reverse
于 2013-01-15T00:27:06.543 に答える
-6

これは、時間が 24 時間形式で、開始時間が終了時間よりも短い場合にのみ機能します。

Time start = DateUtil.convertStringToTime(Object.getStartTime());
Time mid = DateUtil.convertStringToTime(time);
Time end = DateUtil.convertStringToTime(Object.getEndTime());

    if(mid.getHours()>start.getHours() && mid.getHours()< end.getHours())
    {
        flag=true;
    }
    else if(mid.getHours() == start.getHours() && mid.getHours() < end.getHours())
    {
        if(mid.getMinutes() > start.getMinutes())
        {               
            flag=true;              
        }
        else if(mid.getMinutes() == start.getMinutes())
        {               
            if(mid.getSeconds() >= start.getSeconds())
            {
                flag=true;
            }
        }
    }
    else if(mid.getHours() > start.getHours() && mid.getHours() == end.getHours())
    {
        if(mid.getMinutes() < end.getMinutes())
        {
            flag=true;
        }
        else if(mid.getMinutes() == end.getMinutes())
        {
            if(mid.getSeconds() <= end.getSeconds())
            {
                flag=true;
            }
        }
    }
    else if(mid.getHours() == start.getHours() && mid.getHours() == end.getHours())
    {
        if(mid.getMinutes() > start.getMinutes() && mid.getMinutes() < end.getMinutes())
        {
            flag=true;
        }           
        else if(mid.getMinutes() == start.getMinutes() && mid.getMinutes() < end.getMinutes())
        {
            if(mid.getSeconds() > start.getSeconds())
            {
                flag=true;
            }
        }
        else if(mid.getMinutes() > start.getMinutes() && mid.getMinutes() == end.getMinutes())
        {
            if(mid.getSeconds() < end.getSeconds())
            {
                flag=true;
            }
        }
        else if(mid.getMinutes() == start.getMinutes() && mid.getMinutes() == end.getMinutes())
        {
            if(mid.getSeconds() > start.getSeconds() && mid.getSeconds() < end.getSeconds())
            {
                flag=true;
            }
        }
    }
于 2015-11-21T09:30:46.300 に答える