Jak mogę ustawić datę i godzinę 1 miesiąc temu za pomocą DateTime.now.strftime („% Y-% m-% d”)?


Próbuję użyć Google Analytics ustawić datę rozpoczęcia i datę zakończenia, aby przechwytywać unikalnych użytkowników w ciągu ostatnich 30 dni.
end_date = DateTime.now.strftime ("% Y-% m-% d")
jak ustawić
start_date
30 dni temu.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zdaję sobie sprawę, że to pytanie jest bardzo stare, ale oto prosty sposób, aby to zrobić dla tych, którzy muszą wiedzieć:
start_date = (Date.now - 30.days).strftime("%Y-%m-%d")

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

Możesz zrobić to samo z
DateTime.now
i
Time.now
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Za pomocą podstawowego Rubiego możesz to zrobić:
> 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")
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Problem polega na tym, że przy tworzeniu
end_date
posunąłeś się za daleko.
Zamieniasz go w ciąg, który nie ma zdolności matematycznych. Zamiast tego pozostaw to jako DateTime, a odziedziczysz zdolność

dodaj i odejmij całość
http://ruby-doc.org/stdlib-2.0 ... -i-2D
liczby do obliczenia daty:
require 'date'datetime_now = DateTime.now
end_date = datetime_now.strftime("%Y-%m-%d") # => "2013-08-06"
end_date.class # => Stringend_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)>

Zwróć uwagę, że
end_date - 30
zwraca DateTime, czyli dokładnie 30 dni wcześniej; składnik czasu zostaje zachowany. Przekonwertuj wartość na ciąg, gdy tylko uzyskasz żądaną wartość.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zaktualizowano za sugestią Blaszanego Drwala:
W roku 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")

W Railsach lub jeśli wymagane jest
active_support/time
:
Metody korzystania z dni temu:
start_date = 30.days.ago

Oto kod:
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")

W związku z tym data_początkowa jest dokładnie 30 dni przed datą_końcową. Jeśli utworzysz dwa wystąpienia DateTimes, nie będą one rozdzielane dokładnie 30 dniami.
Dostęp do metod
days
i
ago
poza środowiskiem Rails można uzyskać za pomocą tego wiersza:
require 'active_support/time'
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Sugerowałbym użycie do tego metody pomocniczej. Raczej
# 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

pomoże Ci zażądać zakresów czasowych. Więc kiedy poprosisz o coś takiego;
time_range(0, "months")

zwróci zakres czasu sprzed 0 miesięcy (w tym miesiącu);
Thu, 01 Sep 2016 00:00:00 UTC +00:00..Fri, 30 Sep 2016 23:59:59 UTC +00:00

Następnie możesz po prostu wysłać zapytanie do obiektu bazy danych i policzyć wszystko w zakresie za pomocą;
Visit.where(started_at: time_range(unit, timeunit)).count

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się