2

我正在尝试使用设置 Google Analytics 开始日期和结束日期来捕获过去 30 天内的唯一身份访问者。我做了end_date = DateTime.now.strftime("%Y-%m-%d"),我怎么设置start_date为30天前。

4

5 回答 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 天。

daysago方法可以在 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 回答