ruby on rails - site - Itération entre deux DateTimes, avec une étape d'une heure



ruby on rails table (3)

Voici quelque chose que j'ai trouvé récemment:

require 'active_support/all'

def enumerate_hours(start, end_)
  Enumerator.new { |y| loop { y.yield start; start += 1.hour } }.take_while { |d| d < end_ }
end

enumerate_hours(DateTime.now.utc, DateTime.now.utc + 1.day)
# returns [Wed, 20 Aug 2014 21:40:46 +0000, Wed, 20 Aug 2014 22:40:46 +0000, Wed, 20 Aug 2014 23:40:46 +0000, Thu, 21 Aug 2014 00:40:46 +0000, Thu, 21 Aug 2014 01:40:46 +0000, Thu, 21 Aug 2014 02:40:46 +0000, Thu, 21 Aug 2014 03:40:46 +0000, Thu, 21 Aug 2014 04:40:46 +0000, Thu, 21 Aug 2014 05:40:46 +0000, Thu, 21 Aug 2014 06:40:46 +0000, Thu, 21 Aug 2014 07:40:46 +0000, Thu, 21 Aug 2014 08:40:46 +0000, Thu, 21 Aug 2014 09:40:46 +0000, Thu, 21 Aug 2014 10:40:46 +0000, Thu, 21 Aug 2014 11:40:46 +0000, Thu, 21 Aug 2014 12:40:46 +0000, Thu, 21 Aug 2014 13:40:46 +0000, Thu, 21 Aug 2014 14:40:46 +0000, Thu, 21 Aug 2014 15:40:46 +0000, Thu, 21 Aug 2014 16:40:46 +0000, Thu, 21 Aug 2014 17:40:46 +0000, Thu, 21 Aug 2014 18:40:46 +0000, Thu, 21 Aug 2014 19:40:46 +0000, Thu, 21 Aug 2014 20:40:46 +0000, Thu, 21 Aug 2014 21:40:46 +0000] 

https://src-bin.com

Je cherche un moyen efficace, dans Ruby 1.9.x / Rails 3.2.x, d'itérer entre deux objets DateTime, avec une étape d'une heure.

('2013-01-01'.to_datetime .. '2013-02-01'.to_datetime).step(1.hour) do |date|
   ...
end

Je comprends qu'un problème avec ceci est que 1.hour est juste le nombre de secondes, mais mes tentatives pour le convertir en objet DateTime et l'utiliser comme étape ne fonctionnent pas non plus.

J'ai regardé " Méfiez-vous de Ruby Sugar ". Il mentionne, près du bas, que DateTime a une méthode d' step directe. J'ai confirmé cela en exécutant des methods sur un objet DateTime, mais je ne trouve aucune documentation sur l' step dans DateTime, dans les documents de Ruby ou Rails.


Answer #1

Peut-être en retard mais, vous pouvez le faire sans Rails, par exemple pour marcher avec des heures:

Ruby 2.1.0

require 'time' 

hour_step = (1.to_f/24)

date_time = DateTime.new(2015,4,1,00,00)
date_time_limit = DateTime.new(2015,4,1,6,00)

date_time.step(date_time_limit,hour_step).each{|e| puts e}

2015-04-01T00:00:00+00:00
2015-04-01T01:00:00+00:00
2015-04-01T02:00:00+00:00
2015-04-01T03:00:00+00:00
2015-04-01T04:00:00+00:00
2015-04-01T05:00:00+00:00
2015-04-01T06:00:00+00:00

Ou minutes:

#one_minute_step = (1.to_f/24/60)

fifteen_minutes_step = (1.to_f/24/4)

date_time = DateTime.new(2015,4,1,00,00)
date_time_limit = DateTime.new(2015,4,1,00,59)

date_time.step(date_time_limit,fifteen_minutes_step).each{|e| puts e}

2015-04-01T00:00:00+00:00
2015-04-01T00:15:00+00:00
2015-04-01T00:30:00+00:00
2015-04-01T00:45:00+00:00

J'espère que ça aide.


Answer #2

Semblable à ma réponse dans " Comment retourner un tableau de jours et d'heures à partir d'une plage? ", L'astuce consiste à utiliser to_i pour travailler avec des secondes depuis l'époque:

('2013-01-01'.to_datetime.to_i .. '2013-02-01'.to_datetime.to_i).step(1.hour) do |date|
  puts Time.at(date)
end

Notez que Time.at() convertit en utilisant votre fuseau horaire local, donc vous pouvez spécifier UTC en utilisant Time.at(date).utc





ruby-on-rails-3