比较时间,没有日期?

时间:2013-01-15 00:20:25

标签: ruby-on-rails ruby

我需要编写一种方法来检查Time.now是否在商店的营业时间和营业时间之间。

开启和关闭时间保存为时间对象但我无法比较核心,因为商店在2012/2/2保存了小时数,因此营业时间将类似于:

2012-02-02 02:30:00 UTC

Time.now将是:

07:23 +0200

如何比较没有日期部分的时间部分?

8 个答案:

答案 0 :(得分:35)

您可以比较Time没有日期部分,例如,如下所示:

time1.utc.strftime( "%H%M%S%N" ) <= time2.utc.strftime( "%H%M%S%N" )

答案 1 :(得分:2)

尝试将时间转换为数字并删除日期。由于时间表示为自UNIX纪元以来的秒数,小数是秒的一小部分,因此您可以将此数字转换为天数,其中分数是一天的一小部分。

基于日期的数字=红宝石时间数/ 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

答案 2 :(得分:2)

有一个不错的库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

它将为您做更多的事情,例如将时间滚动到下一个或上一个营业时间,计算两个时间戳之间的营业时间等。

答案 3 :(得分:1)

您可以将时间分为小时,分钟和秒。

Time Class中所述:

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

由于您需要比较它是否在2小时内,您可以按照以下方式进行检查。

if hour > openingHour and hour < closingHour

答案 4 :(得分:1)

您可以直接比较时间与常规参考的偏移量(例如午夜),而不必尝试直接比较时间点。您可能需要确保所有时间都使用相同的时区,具体取决于您的用例。

在Rails中,可以使用#seconds_since_midnight这样的帮助程序之一轻松完成此操作:

#given
opening_hour = DateTime.new(2012,2,2,2,30,0)

#compare
now = DateTime.now.in_time_zone('UTC')
opening_hour_since_midnight = opening_hour.seconds_since_midnight
now_since_midnight = now.seconds_since_midnight
p 'shop opened' if now_since_midnight > opening_hour_since_midnight

答案 5 :(得分:0)

你可以只比较没有日期部分的铁路时间,如:--- 此处post_review是表格,我们在任何日期的上午10点至下午5点之间仅获得post_review的{​​{1}}记录

created_at

答案 6 :(得分:-1)

close_or_open_time_object.to_a.first(3).reverse <=> Time.now.to_a.first(3).reverse

答案 7 :(得分:-4)

这仅适用于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;
            }
        }
    }