Преобразование ActiveSupport :: TimeWithZone to DateTime

18

Я пытаюсь выполнить каждый 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?

    
задан Brig 21.12.2010 в 00:17
источник

2 ответа

15

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 }
    
ответ дан Jason Weathered 21.12.2010 в 03:16
  • stackoverflow.com/questions/1261329/... рекомендует DateTime как лучший способ справиться со своими датами! –  Andre Schweighofer 25.11.2011 в 12:33
  • DateTime - это класс Ruby. ActiveSupport :: TimeWithZones - это Rails. Поэтому, говоря, что он «старый», и вы должны его избегать, неточно. См. Ответ ChrisJ для лучшего ответа. –  IAmNaN 18.04.2013 в 21:28
  • Postgres '' Timestamp 'преобразуется в Rails TimeWithZone, с которым совсем не удобно отображать, поэтому использование DateTime очень часто бывает лучше, и вот уже 4 года оно все еще не устарело. –  Ian M 13.09.2014 в 20:07
  • Почему я не хочу использовать DateTime? DateTime - это совокупность даты и времени. Так что, если мне нужна дата плюс время, я должен использовать DateTime, нет? Хотя кажется, что Time также дает вам дату. Плюс со временем, вы можете использовать зону, например. Time.zone.now => Tue, 02 Jun 2015 14:01:58 EDT -04: 00, который дает вам дату, время и часовой пояс. –  Donato 02.06.2015 в 20:02
  • @Donato Вы хотите избежать использования DateTime, потому что Time.zone может делать все, что может делать DateTime, и проще всегда помнить о том, чтобы использовать, чем вспоминать добавление .in_time_zone после ваших данных конкретно. Дополнительные примеры и рассуждения здесь: danilenko.org/2012/7/6/rails_timezones –  Magne 29.08.2017 в 09:54
28

Я подумал, что было бы полезно обновить этот ответ, поскольку я недавно искал это. Самый простой способ добиться этого преобразования - использовать функцию .to_datetime ().

например.

5.hours.from_now.class              # => ActiveSupport::TimeWithZone
5.hours.from_now.to_datetime.class  # => DateTime

ref: Ссылка

    
ответ дан Chris A James 05.04.2013 в 01:53
  • Спасибо @Chris J. –  fmquaglia 28.05.2015 в 22:48