我有一个用户界面,我们在其中选择日期范围,然后执行查询以检查该范围内的订单。
所以接受的有效格式是
a)2013-04-01 17:00:00 - 2013-04-16 18:00:00
b)2013-04-01 17:00:00 - 2013-04-16
c)2013-04-01 - 2013-04-16
我将它拆分为ruby,给我start_date和end_date。我没有触及开始时间,因为它已准备好进行sql查询。
但是必须修改end_date,因为执行远程查询created_at BETWEEN '2013-04-01 17:00:00' AND '2013-04-16'
不会给出结果集中应包含的第16个结果。 (与2013-04-16 00:00:00相比)
所以这是工作解决方案,我想出了
end_date = Time.parse(end_date).strftime("%T")=="00:00:00" ? (end_date.to_s) + " 23:59:59" : end_date.to_s
有没有更好的方法来做到这一点,因为上面看起来很混乱? (看或1-2行答案,而不是更多)
答案 0 :(得分:4)
您可以使用DateTime.parse(str)
方法:
date_str = "2013-04-16"
date = DateTime.parse(date_str)
#=> Tue, 16 Apr 2013 00:00:00 +0000
date_time_str = "2013-04-16 18:00:00"
date = DateTime.parse(date_time_str)
#=> Tue, 16 Apr 2013 18:00:00 +0000
然后,如果没有选择时间,您可以测试.hour
(或.minute
)并将end_date
设置为end_of_day
:
end_date = (date.hour == 0 && date.minute == 0) ? date.end_of_day : date
稍有改进:您可以测试解析日期是否等于此日期的开头(无小时/分钟/秒):
date = DateTime.parse("2013-12-12")
#=> Thu, 12 Dec 2013 00:00:00 +0000
date.beginning_of_day
#=> Thu, 12 Dec 2013 00:00:00 +0000
end_date = (date.beginning_of_day == date) ? date.end_of_day : date
#=> Thu, 12 Dec 2013 23:59:59 +0000
2013-04-16 00:00:00
之类的日期时, 要解决问题,您可以使用.include?
检查字符串是否包含“00:00:00
”部分:
date_str = "2013-04-16 00:00:00"
date = DateTime.parse(date_str)
end_date = date if date_str.include?('00:00:00') # means the user explicitly wants the time at 00:00 and 00 second
end_date ||= (date.beginning_of_day == date) ? date.end_of_day : date # set end_date if end_date.nil?