Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何定义一天前下午2:00使用Ruby?_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 如何定义一天前下午2:00使用Ruby?

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)我想这就可以了:

我需要搜索从昨天下午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)我想这就可以了:

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))
如果你真的要处理未来的事情