Рубин Я пытаюсь взять дату DST предыдущих методов и проверить, что время прошло вперед или назад на один час - PullRequest
0 голосов
/ 01 октября 2018

Я пишу тест автоматизации с использованием двух методов для целей перехода на летнее время.Эти методы определены следующим образом:

  • Настройте введенный DATETIME (через Time.Parse) для округления до ближайшего изменения DST
  • Убедитесь, что DATETIME метода изменился либо за один часназад или вперед, будь то Time.Parse .include?("March") ИЛИ .include("November")

Чтобы повторить, цель этого метода состоит в том, чтобы взять дату из предыдущего метода, который я написал (который корректирует текущую дату и раундыэто до следующей даты летнего времени), определите, будет ли возвращаемое значение март или ноябрь, и ПОДТВЕРЖДАЕТ, что время прошло вперед или назад.Первый метод завершен и выглядит следующим образом:

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

Теперь мой вопрос: как мне взять возвращенное значение DATETIME из этого оператора case, поместить его в оператор if, чтобы определить, включает ли ономесяц НОЯБРЬ или МАРТ, а затем, если наступает март, проверьте, идет ли время на один час вперед или на ноябрь, а затем проверьте, вернется ли время на один час.

1 Ответ

0 голосов
/ 01 октября 2018

Несколько примечаний:

  • ваш date на самом деле Time
  • вы должны удалить date в case date, если when - логические значения,Время никогда не будет логическим, поэтому вы всегда получите оператор else.
  • , или вы можете оставить date и заменить when диапазоном времени.См. здесь .

Ваш метод ищет первое изменение dst, позднее чем time.Таким образом, вы можете использовать find в списке раз:

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>'
...