我正在尝试使用设置 Google Analytics 开始日期和结束日期来捕获过去 30 天内的唯一身份访问者。我做了end_date = DateTime.now.strftime("%Y-%m-%d")
,我怎么设置start_date
为30天前。
问问题
11255 次
5 回答
5
我意识到这个问题已经很老了,但是对于任何需要知道的人来说,这是一种干净的方法:
start_date = (Date.now - 30.days).strftime("%Y-%m-%d")
或者
start_date = (Date.now - 1.month).strftime("%Y-%m-%d")
您可以使用DateTime.now
, 和Time.now
于 2015-08-28T10:54:54.940 回答
3
问题是您在创建end_date
.
你把它变成了一个没有数学能力的字符串。相反,将其保留为 DateTime 并且您继承了添加和减去整数来进行日期数学运算的能力:
require 'date'
datetime_now = DateTime.now
end_date = datetime_now.strftime("%Y-%m-%d") # => "2013-08-06"
end_date.class # => String
end_date = datetime_now # => #<DateTime: 2013-08-06T14:55:20-07:00 ((2456511j,78920s,731393000n),-25200s,2299161j)>
end_date - 30 # => #<DateTime: 2013-07-07T14:55:20-07:00 ((2456481j,78920s,731393000n),-25200s,2299161j)>
请注意,它end_date - 30
返回的 DateTime 正好早于 30 天;时间分量被保留。获得所需值后,将值转换为字符串。
于 2013-08-06T21:58:14.380 回答
3
使用基本的 Ruby,您可以这样做:
> irb
require 'date' # needed
today_minus_30 = Date.today.to_date - 30
# if you need the date as a string
date_as_string = today_minutes_30.strftime("%Y-%m-%d")
于 2013-08-06T22:10:23.127 回答
0
根据 Tin Man 的建议更新:
在红宝石中:
require 'date'
end_date = DateTime.now
start_date = end_date - 30
formatted_end_date = end_date.strftime("%Y-%m-%d")
formatted_start_date = start_date.strftime("%Y-%m-%d")
在 Rails 中或如果active_support/time
需要:
使用 days 和 ago 方法:
start_date = 30.days.ago
这是代码:
end_date = DateTime.now
start_date = end_date - 30.days
formatted_end_date = end_date.strftime("%Y-%m-%d")
formatted_start_date = start_date.strftime("%Y-%m-%d")
这样 start_date 正好比 end_date 早 30 天。如果您实例化两个 DateTime,它们将不会正好相隔 30 天。
days
和ago
方法可以在 Rails 环境之外通过以下行访问:
require 'active_support/time'
于 2013-08-06T20:50:31.597 回答
0
我建议为此使用辅助方法。就像是
# Gets time range for x number timeunits ago
def time_range(unit, timeunit = nil)
if timeunit == "weeks"
now = Time.zone.now.beginning_of_week
elsif timeunit == "months"
now = Time.zone.now.beginning_of_month
else
now = Time.zone.now.beginning_of_day
end
# Ex: time_range(0, "days") --> Get the time range for today between the beginning of today and the beginning of tommorow - 1 second
now - unit.send(timeunit)..now + 1.send(timeunit) - 1.seconds - unit.send(timeunit)
end
将帮助您请求时间范围。所以当你请求类似的东西时;
time_range(0, "months")
它将返回 0 个月前(本月)的时间范围;
Thu, 01 Sep 2016 00:00:00 UTC +00:00..Fri, 30 Sep 2016 23:59:59 UTC +00:00
然后您可以简单地查询数据库对象并计算范围内的所有内容;
Visit.where(started_at: time_range(unit, timeunit)).count
于 2016-09-07T08:11:26.720 回答