我需要检查DateTime是否为有效的ISO8601格式。喜欢:#iso8601?
我检查了红宝石是否有特定的方法,但我没有找到任何方法。目前,我正在使用date.iso8601 == date来检查这个。有什么好办法吗?
编辑
解释我的环境,改变问题的范围。
因此,我的项目将使用js,这就是我需要iso8601字符串格式的原因。我想知道是什么更好或正确的方式,将数据以正确的格式保存在数据库中,或者让ActiveRecord完成他们的工作,并在我需要时间信息时对其进行操作。
发布于 2015-07-25 14:36:42
我不太明白你的问题。我假设您希望检查一个DateTime字符串,如果它是有效的ISO8601格式日期字符串是否有效。如果我错了,请纠正我。
您可以使用类方法Time.iso8601和Date.iso8601。为了使用它们,您需要标准库中的“日期”和“时间”库。一个注意事项是,正如您从名称中看到的,它们不是谓词方法(没有?),而是在输入错误的字符串时引发带有“无效日期”消息的ArgumentError。因此,您需要添加一个begin救援块。例如:
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永远是错误的。我说错了吗?
更新
作为对更新问题的回答,最好能正常地将DateTime存储在数据库中,并调用iso8601方法来获取ISO8601字符串。对于创建DateTime,只需使用Time.iso8601将输入字符串解析为DateTime对象。
发布于 2022-01-16 16:22:10
Ruby 3.1:
begin
invalid_date = '1970-01-32'
Date.iso8601(invalid_date)
rescue Date::Error
puts 'The date is invalid'
endRails 6.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还不完全清楚您是否需要让它与Rails一起工作,因此这两种情况都有解决方案。
https://stackoverflow.com/questions/31627276
复制相似问题