首页 > 解决方案 > Ruby 我正在尝试采用以前的方法 DST 日期并验证时间向前或向后一小时

问题描述

我正在为夏令时目的使用两种方法编写自动化测试。这些方法定义如下:

重申一下,此方法的目的是从我编写的上一个方法中获取日期(调整当前日期并将其四舍五入到下一个 DST 日期),确定返回值是 3 月还是 11 月,并验证时间已过向前或向后。第一种方法已经完成,如下:

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

现在,我的问题是,如何从该 case 语句中获取返回的 DATETIME 值,将其放入 if 语句中以确定它是否包含 NOVEMBER 或 MARCH 月份,然后如果是 3 月,则检查时间是否向前一小时,或者如果是十一月,然后检查时间是否向后一小时。

标签: rubytimeautomationdstqa

解决方案


几点注意事项:

  • date实际上是一个Time
  • 如果你是布尔值,你应该删除datein 。时间永远不会是布尔值,因此您将始终得到声明。case datewhenelse
  • 或者您可以离开date并替换when一段时间。见这里

您的方法正在寻找晚于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>'

推荐阅读