Ruby 检查日期时间是否为 iso8601 并保存

Ruby check if datetime is a iso8601 and saving

我需要检查 DateTime 是否采用有效的 ISO8601 格式。 喜欢:#iso8601?

我检查了 ruby 是否有特定的方法,但我没有找到任何方法。 目前我正在使用 date.iso8601 == date 来检查这个。 有什么好的方法吗?

编辑

解释我的环境,并改变问题的范围。

因此,我的项目将使用 js api FullCalendar,这就是我需要 iso8601 字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让 ActiveRecord 完成它们的工作并在我需要时间信息时对其进行操作。

我不太明白你的问题。我假设您想检查 DateTime 字符串是否是有效的 ISO8601 格式日期字符串。如果我错了请纠正我。

您可以使用 class 方法 Time.iso8601Date.iso8601。为了使用它们,您需要从标准库中获取 'date' 和 'time' 库。一个警告是,正如您从名称中看到的那样,它们不是谓词方法(没有?),相反,如果输入了错误的字符串,它们会引发带有 "invalid date" 消息的 ArgumentError。所以,你需要添加一个 begin rescue 块。例如

require 'time'

t = Time.now
time_string = t.rfc2822 # intentionally set to wrong format string
begin
  Time.iso8601(time_string)
  puts "Yeah, correct string"
rescue ArgumentError => e
  puts e
  puts "Nah, wrong string"

end

这比您的 "date.iso8601 == date" 更冗长。但我发布它是因为不明白你的方法是如何工作的。对我来说 date.iso8601 == date 永远是错误的。我错了吗?

更新

作为更新问题的答案,您最好将日期时间正常存储在数据库中,然后调用 iso8601 方法来获取 ISO8601 字符串。要创建 DateTime,您只需使用 Time.iso8601 将输入字符串解析为 DateTime 对象即可。

Ruby3.1:

begin
  invalid_date = '1970-01-32'
  Date.iso8601(invalid_date)
rescue Date::Error
  puts 'The date is invalid'
end

Rails6.1:

鉴于该属性在基础数据库中的类型为 date,您将无法将其设置为无效值。以下测试(写在RSpec)通过:

specify 'Rails ignores invalid date' do
  invalid_date = '1970-01-32'
  invoice = Invoice.new

  invoice.date = invalid_date

  expect(invoice.date).to be nil
end

P.S。目前还不完全清楚您是否需要使用 Rails 或不使用它,因此两种情况都有解决方案。