Преобразование ActiveSupport:: TimeWithZone в DateTime
Я пытаюсь выполнить каждый N дней между двумя датами. Я пробовал следующий код, но не работал, потому что startDate и endDate - это объекты ActiveSupport:: TimeWithZone, а не объекты DateTime, как я думал.
startDate.step(endDate, step=7) { |d| puts d.to_s}
min.step(max, step=stepInt){ |d|
puts d.to_s
}
Как скрыть объект TimeWithZone до DateTime?
Ответы
Ответ 1
DateTime
- это старый класс, который вы обычно хотите избежать. Time
и Date
- это те, которые вы хотите использовать. ActiveSupport::TimeWithZone
действует как Time
.
Для перехода по датам вы, вероятно, захотите иметь дело с объектами Date
. Вы можете преобразовать Time
(или ActiveSupport::TimeWithZone
) в Date
с помощью Time#to_date
:
from.to_date.step(to.to_date, 7) { |d| puts d.to_s }
Ответ 2
Я подумал, что было бы полезно обновить этот ответ, поскольку я недавно искал это. Самый простой способ добиться этого преобразования - использовать функцию .to_datetime().
например.
5.hours.from_now.class # => ActiveSupport::TimeWithZone
5.hours.from_now.to_datetime.class # => DateTime
ref: http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html#method-i-to_datetime