比较时间,没有日期?

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

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

 2012-02-02 02:30:00 UTC 

Time.now将是:

 07:23 +0200 

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

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

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

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

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

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

如时间类中所述 :

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

由于您需要比较它是否在2小时内,您可以检查如下。

 if hour > openingHour and hour < closingHour 

你可以只比较没有日期部分的rails中的时间,如:—这里post_review是表,我们只获得post_review这些记录,这些记录是在任何日期的上午10点到下午5点之间创建的。

 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") ) 

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

在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 

有一个很好的图书馆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 

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

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

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