Подтвердить что ты не робот

Преобразование 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?

4b9b3361

Ответ 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