Google アナリティクスの開始日と終了日を設定して、過去 30 日間のユニーク ユーザーを取得しようとしています。を作成しましたが、 30 日前end_date = DateTime.now.strftime("%Y-%m-%d")
に設定するにはどうすればよいですか。start_date
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
問題は、 の作成が行き過ぎていることです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
正確に 30 日前の DateTime を返すことに注意してください。時間コンポーネントは保持されます。必要な値を取得したら、値を文字列に変換します。
ティンマンの提案に従って更新:
ルビーの場合:
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
必要な場合:
日と前の方法を使用します。
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 日前になります。2 つの DateTime をインスタンス化すると、正確に 30 日離れることはありません。
days
およびメソッドは、次のago
行を使用して Rails 環境の外部からアクセスできます。
require 'active_support/time'
そのためにヘルパーメソッドを使用することをお勧めします。何かのようなもの
# 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