Ruby on rails 如何定义一天前下午2:00使用Ruby?
我需要搜索从昨天下午2点到现在的事件,我正在这样尝试Ruby on rails 如何定义一天前下午2:00使用Ruby?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我需要搜索从昨天下午2点到现在的事件,我正在这样尝试 events.where("DATE(created_at) >= ? and DATE(created_at) <=", (1.day.ago + 14.hours).strftime('%Y-%m-%d %H:%M:'), Time.now.strftime('%Y-%m-%d %H:%M:') ) events.where(“DATE(created\u at)>=”和DATE(created\u at)我想这就可以了:
events.where("DATE(created_at) >= ? and DATE(created_at) <=", (1.day.ago + 14.hours).strftime('%Y-%m-%d %H:%M:'), Time.now.strftime('%Y-%m-%d %H:%M:') )
events.where(“DATE(created\u at)>=”和DATE(created\u at)我想这就可以了:
a = 1.day.ago.strftime('%Y-%m-%d')
yyyy, mm, dd = $1, $2, $3 if a =~ /(\d+)-(\d+)-(\d+)/
t = Time.mktime(yyyy, mm, dd, 14)
events.where("DATE(created_at) >= ? and DATE(created_at) <=", t.strftime('%Y-%m-%d %H:%M:'), Time.now.strftime('%Y-%m-%d %H:%M:') )
a=1.day.ago.strftime(“%Y-%m-%d”)
yyyy,mm,dd=$1,$2,$3如果a=~/(\d+)-(\d+)-(\d+)/
t=Time.mktime(yyyy,mm,dd,14)
事件。其中(“DATE(created_at)>=”和DATE(created_at)我想这就可以了:
a = 1.day.ago.strftime('%Y-%m-%d')
yyyy, mm, dd = $1, $2, $3 if a =~ /(\d+)-(\d+)-(\d+)/
t = Time.mktime(yyyy, mm, dd, 14)
events.where("DATE(created_at) >= ? and DATE(created_at) <=", t.strftime('%Y-%m-%d %H:%M:'), Time.now.strftime('%Y-%m-%d %H:%M:') )
a=1.day.ago.strftime(“%Y-%m-%d”)
yyyy,mm,dd=$1,$2,$3如果a=~/(\d+)-(\d+)-(\d+)/
t=Time.mktime(yyyy,mm,dd,14)
事件。其中(“日期(创建时间)>=”和日期(创建时间)这是您要找的吗
事件。在哪里(“在?和之间创建?”,
时间.本地(1.day.ago.year,1.day.ago.month,1.day.ago.day,14,
0.to_s(:db),Time.now.to_s(:db))
这就是你要找的吗
事件。在哪里(“在?和之间创建?”,
时间.本地(1.day.ago.year,1.day.ago.month,1.day.ago.day,14,
0.to_s(:db),Time.now.to_s(:db))
如果您使用的是Rails(看起来是),那么您需要
1.day.ago.beginning_of_day + 14.hours
因为
1.day.ago
正好在24小时前给你
编辑:塔德曼的文章更精确,因为它涵盖了夏时制和夏时制之间的转换。使用
DateTime.now.yesterday.beginning_of_day.change(:hour => 14)
如果您使用的是Rails(看起来是),那么您需要
1.day.ago.beginning_of_day + 14.hours
因为
1.day.ago
正好在24小时前给你
编辑:塔德曼的文章更精确,因为它涵盖了夏时制和夏时制之间的转换。使用
DateTime.now.yesterday.beginning_of_day.change(:hour => 14)
首先,您正在将在
时间戳创建的转换为搜索条件需要知道一天中的时间的日期。您可以通过在查询中删除DATE()
调用来解决此问题,您可能应该在执行时切换到
之间的
其次,您的日期算法,1.day.ago+14.hours
,不一定会产生“昨天14:00”,因为1.day.ago
包含一天中的某个时间。您可以使用date.day+14.hours
来解决这个问题
第三,你不必自己strftime
事情,ActiveRecord将自己处理字符串化
第四,您可能会遇到时区问题,这是由于手动使用strftime而忽略了时区。如果让ActiveRecord将您的时间转换为数据库期望的时间,那么它将为您应用必要的时区调整
我想你想要更像这样的东西:
events.where(
'created_at between :start and :end',
:start => Date.yesteday + 14.hours,
:end => Time.now
)
首先,您正在将在
时间戳创建的转换为搜索条件需要知道一天中的时间的日期。您可以通过在查询中删除DATE()
调用来解决此问题,您可能应该在执行时切换到
之间的
其次,您的日期算法,1.day.ago+14.hours
,不一定会产生“昨天14:00”,因为1.day.ago
包含一天中的某个时间。您可以使用date.day+14.hours
来解决这个问题
第三,你不必自己strftime
事情,ActiveRecord将自己处理字符串化
第四,您可能会遇到时区问题,这是由于手动使用strftime而忽略了时区。如果让ActiveRecord将您的时间转换为数据库期望的时间,那么它将为您应用必要的时区调整
我想你想要更像这样的东西:
events.where(
'created_at between :start and :end',
:start => Date.yesteday + 14.hours,
:end => Time.now
)
首先,你需要弄清楚“昨天下午2:00”是什么,我将其翻译为:
DateTime.now.yesterday.beginning_of_day.change(:hour => 14)
这里发布的许多解决方案都建议在昨天的开始增加14小时,但这是错误的。记住夏时制。更安全的方法是将小时更改为适当的值
一天中没有24小时。有23小时、24小时和25小时,具体取决于哪一天。为了证明这一点,请查看DST过渡期:
Time.zone = 'EST5EDT'
DateTime.parse('2012-03-12 12:34:56 -0500').to_time_in_current_zone.yesterday.beginning_of_day + 14.hours
# => Sun, 11 Mar 2012 15:00:00 EDT -04:00
那是下午3点,因为凌晨1点到2点没有发生。使用change
您应该总能得到正确的结果:
DateTime.parse('2012-03-12 12:34:56 -0500').to_time_in_current_zone.yesterday.beginning_of_day.change(:hour => 14)
# => Sun, 11 Mar 2012 14:00:00 EDT -04:00
通常,您也可以使用BETWEEN
操作符来简化日期计算,但在您的情况下,由于您是在该时间点和现在之间提取,假设您将来没有事件,您可以省略一个绑定。另外,ActiveRecord在进行查询时应正确处理日期时间值的格式设置,以便de>strftime
调用通常会适得其反,因为很容易出错
events.where("DATE(created_at) >= ?", DateTime.now.yesterday.beginning_of_day.change(:hour => 14))
如果出于任何原因,您必须处理未来事件:
events.where("DATE(created_at) BETWEEN ? AND ?", DateTime.now.yesterday.beginning_of_day.change(:hour => 14), DateTime.now)
请记住,以UTC格式存储数据库时间并在执行查询时将本地时间转换为UTC通常是有利的。如果您需要同时处理多个时区,则在数据库中存储受时区污染的值可能会产生各种各样的麻烦。首先,您需要了解“昨天下午2:00”是什么“我要翻译成:
DateTime.now.yesterday.beginning_of_day.change(:hour => 14)
这里发布的许多解决方案都建议在昨天的开始增加14小时,但这是错误的。记住夏时制。更安全的方法是将小时更改为适当的值
一天中没有24小时。有23小时、24小时和25小时,具体取决于哪一天。为了证明这一点,请查看DST过渡期:
Time.zone = 'EST5EDT'
DateTime.parse('2012-03-12 12:34:56 -0500').to_time_in_current_zone.yesterday.beginning_of_day + 14.hours
# => Sun, 11 Mar 2012 15:00:00 EDT -04:00
那是下午3点,因为凌晨1点到2点没有发生。使用change
您应该总能得到正确的结果:
DateTime.parse('2012-03-12 12:34:56 -0500').to_time_in_current_zone.yesterday.beginning_of_day.change(:hour => 14)
# => Sun, 11 Mar 2012 14:00:00 EDT -04:00
通常,您也可以使用BETWEEN
操作符来简化日期计算,但在您的情况下,由于您是在该时间点和现在之间提取,假设您将来没有事件,您可以省略一个绑定。另外,ActiveRecord在进行查询时应正确处理日期时间值的格式设置,以便de>strftime
调用通常会适得其反,因为很容易出错
events.where("DATE(created_at) >= ?", DateTime.now.yesterday.beginning_of_day.change(:hour => 14))
如果你真的要处理未来的事情