2 votes

Ruby, j'essaie de prendre une date DST de méthodes précédentes et de vérifier que l'heure a avancé ou reculé d'une heure.

J'écris un test d'automatisation en utilisant deux méthodes pour l'heure d'été. Ces méthodes sont définies comme suit :

  • Réglez le DATETIME entré (via Time.Parse ) pour arrondir au changement de DST le plus proche
  • Vérifiez si la DATETIME de la méthode a changé d'une heure en arrière ou en avant, si la date de début de la méthode a été modifiée. Time.Parse .include?("March") OU .include("November")

Pour réitérer, le but de cette méthode est de prendre la date de la méthode précédente que j'ai écrite (qui ajuste la date actuelle et l'arrondit à la date DST suivante), de déterminer si la valeur de retour est mars ou novembre, et de VÉRIFIER que le temps a avancé ou reculé. La première méthode est terminée et se présente comme suit :

def dst_datechange(date)
  date = Time.now
  case date
  when (date > Time.Parse('March 11, 2018 2:00am')) && (date < 
Time.parse('November 4, 2018 2:00am'))
    date = Time.parse('November 4, 2018 2:00am')
  when (date > Time.Parse('November 4 2018, 2:00am')) && (date < 
Time.parse('March 10, 2:00am'))
    date = Time.parse('March 10, 2019 2:00am')
  when (date > Time.Parse('March 10, 2019 2:00am')) && (date < 
Time.parse('November 3, 2019 2:00am'))
    date = Time.parse('November 3, 2019 2:00am')
  when (date > Time.Parse('November 3, 2019 2:00am')) && (date < 
Time.parse('March 8, 2020 2:00am'))
    date = Time.parse('March 8, 2020 2:00am')
  when (date > Time.Parse('March 8, 2020 2:00am')) && (date < 
Time.parse('November 1, 2020 2:00am'))
    date = Time.parse ('November 1, 2020 2:00am')
  else
    raise "The date #{date} does not match any dst date parameter"
  end
  date
end

Maintenant, ma question est la suivante : comment puis-je prendre la valeur DATETIME renvoyée par cette instruction case, la placer dans une instruction if pour déterminer si elle inclut un mois de NOVEMBRE ou de MARS, et ensuite, si c'est mars, vérifier si le temps avance d'une heure ou si c'est novembre, vérifier si le temps recule d'une heure.

1voto

Eric Duminil Points 38857

Quelques notes :

  • votre date est en fait un Time
  • vous devez retirer le date en case date si votre when sont des booléens. Une heure ne sera jamais un booléen, vous obtiendrez donc toujours le symbole else déclaration.
  • ou vous pouvez partir date et remplacer when avec une fourchette de temps. Voir aquí .

Votre méthode recherche le premier changement de dst qui est postérieur à time . Vous pouvez donc utiliser find sur une liste de temps :

def next_time_change(time)
  next_change = [
    [2018, 3, 11],
    [2018, 11, 4],
    [2019, 3, 10],
    [2019, 11, 3],
    [2020, 3, 11],
    [2020, 11, 1]
  ].map do |year, month, day|
    Time.local(year, month, day, 2)
  end.find do |time_change|
    time < time_change
  end
  raise "The time #{time} does not match any dst date parameter" unless next_change
  next_change
end

puts next_time_change(Time.now)
# => 2018-11-04 02:00:00 +0100

puts next_time_change(Time.local(2030, 1, 1))
# dst_change.rb:14:in `next_time_change': The time 2030-01-01 00:00:00 +0100 does not match any dst date parameter (RuntimeError)
#   from dst_change.rb:21:in `<main>'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X