ruby - Ruby 我正在尝试采用以前的方法 DST 日期并验证时间向前或向后一小时
问题描述
我正在为夏令时目的使用两种方法编写自动化测试。这些方法定义如下:
- 调整输入的 DATETIME(通过
Time.Parse
)四舍五入到最接近的 DST 变化 - 检查该方法的 DATETIME 是否向后或向前更改了一小时,无论是
Time.Parse
.include?("March")
OR.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 月,则检查时间是否向前一小时,或者如果是十一月,然后检查时间是否向后一小时。
解决方案
几点注意事项:
- 你
date
实际上是一个Time
- 如果你是布尔值,你应该删除
date
in 。时间永远不会是布尔值,因此您将始终得到声明。case date
when
else
- 或者您可以离开
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>'
推荐阅读
- jenkins - 重新启动詹金斯管道中的一个阶段以清除现有目录
- laravel-8 - 当我将 laravel 应用程序从 5.0 更新到 8.0 时
- python - 是否可以将数据包发送到 exe 文件?还是控制一个?
- javascript - 在 Typescript 中,为什么我需要在类的构造函数之外声明一个属性,而不像 Javascript 那样我不需要这样做?
- typescript - React Hook Form - Typescript 问题和错误处理?
- c++ - 为什么我在vscode中使用clangd时没有缩进?
- python - 将两个 SQL lite 数据库与 Python 结合起来
- reactjs - 选择选项时反应选择高度自动增加
- validation - 如何在 PhpStorm 中验证 ini 文件格式?
- laravel - laravel 在迁移中设置 postgresql 标识列