我需要编写一种方法来检查Time.now
是否在商店的营业时间和营业时间之间。
开启和关闭时间保存为时间对象但我无法比较核心,因为商店在2012/2/2
保存了小时数,因此营业时间将类似于:
2012-02-02 02:30:00 UTC
和Time.now
将是:
07:23 +0200
如何比较没有日期部分的时间部分?
答案 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;
}
}
}