我正在尝试使用设置Google Analytics开始日期和结束日期来捕获过去30天内的唯一身份访问者。我制作了end_date = DateTime.now.strftime("%Y-%m-%d")
,如何将start_date
设置为30天前。
答案 0 :(得分:4)
我意识到这个问题已经很老了,但对于需要知道的人来说,这是一个干净的方法:
start_date = (Date.now - 30.days).strftime("%Y-%m-%d")
或
start_date = (Date.now - 1.month).strftime("%Y-%m-%d")
您可以使用DateTime.now
和Time.now
答案 1 :(得分: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")
答案 2 :(得分:2)
问题是你在创建end_date
时走得太远了。
你把它变成了一个没有数学能力的字符串。相反,将其保留为DateTime,并继承add and subtract integers进行日期数学运算的能力:
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
返回的日期时间恰好是提前30天;时间组件被保留。获得所需的值后,将值转换为字符串。
答案 3 :(得分:0)
根据Tin Man的建议更新:
在Ruby中:
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 and 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天。
可以使用以下行在Rails环境之外访问days
和ago
方法:
require 'active_support/time'
答案 4 :(得分: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