如何使用DateTime.now.strftime(“%Y-%m-%d”)将日期时间设置为1个月前?

时间:2013-08-06 20:44:06

标签: ruby datetime

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

5 个答案:

答案 0 :(得分:4)

我意识到这个问题已经很老了,但对于需要知道的人来说,这是一个干净的方法:

start_date = (Date.now - 30.days).strftime("%Y-%m-%d")

start_date = (Date.now - 1.month).strftime("%Y-%m-%d")

您可以使用DateTime.nowTime.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环境之外访问daysago方法:

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