0

我有一个 UI,我们在其中选择一个日期范围,然后执行查询以检查该范围内的订单。

所以接受的有效格式是

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'不会给我 16th 的结果,这些结果应该包含在结果集中。(与 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行答案,不多)

4

1 回答 1

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(or .minute) 并将其设置end_dateend_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

要解决用户输入 DateTime 之类的问题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?
于 2013-05-28T19:11:24.813 回答