【问题标题】:verify that the time went forward or backward one hourRuby 我正在尝试采用以前的方法 DST 日期并验证时间向前或向后一小时
【发布时间】:2019-03-06 02:08:56
【问题描述】:

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

  • 调整输入的 DATETIME(通过 Time.Parse)以四舍五入到最接近的 DST 更改
  • 检查方法的 DATETIME 是否向前或向后更改了一小时,无论是 Time.Parse .include?("March") 还是 .include("November")

重申一下,此方法的目的是从我编写的上一个方法中获取日期(调整当前日期并将其四舍五入到下一个 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 月,则检查以查看如果时间提前一小时或者是 11 月,则检查时间是否提前一小时。

【问题讨论】:

  • 您最好在不参考您的方法dst_datechange 的情况下陈述您的问题(顺便说一句,不使用其参数date,因为date 的值在第一个被覆盖线)。这部分是因为可以更有效地编写该方法(无需硬连线 DST 更改的时间)。更一般地说,当您提出问题时,请避免假设需要特定步骤来回答问题。

标签: ruby time automation dst qa


【解决方案1】:

几点说明:

  • 你的date实际上是一个Time
  • 如果你的when 是布尔值,你应该删除case date 中的date。时间永远不会是布尔值,因此您将始终得到 else 语句。
  • 或者您可以离开date 并将when 替换为一个时间范围。见here

您的方法正在寻找晚于time 的第一个 dst 更改。所以你可以在时间列表中使用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>'

【讨论】:

  • 那么,这基本上是我需要的两种方法的组合吗?对不起,我对编程还是新手,并试图收集我的想法。此方法需要今年和未来的 DST 日期,将它们放在一个数组中。 .map 确实将它们解析为 y/m/d 格式。然后 find 将获取结果并将它们设置在时间更改方法中,该方法返回输入的日期是否在下一个时间更改之前。如果它匹配它,那么它返回净变化。正确...?
  • @AA.:是的。对于给定的time,它会找到下一次 DST 将更改的时间(3 月或 11 月)。数组输入只是为了避免许多Time.parse。顺便说一句,您可能对stackoverflow.com/questions/29494206/… 感兴趣
  • 关于那个链接,我实际上按下了使用 ruby​​ 内置的 .dst 方法,因为我认为它可以工作并且可以节省很多时间,但据我了解,这是不正确的,我们必须写出我们自己的方法来确定当前日期是否是 dst 日期。然而,这是去年三月的一个问题。自从我被告知不要乱用 .dst 方法后,我就没有重新访问它
  • 另外,我收到一个 ArgumentError:STing 与时间的比较失败。我将 2018, 10, 2 传递到我的黄瓜特征参数中(并且方法中提供的 2 假设我认为的时间。)我只传递数字所以我不知道为什么会出现字符串比较错误?
猜你喜欢
  • 2011-12-24
  • 2017-10-28
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2019-02-28
  • 2011-11-29
  • 2021-08-18
  • 2013-04-05
相关资源
最近更新 更多