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.iso8601
和 Date.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 或不使用它,因此两种情况都有解决方案。
我需要检查 DateTime 是否采用有效的 ISO8601 格式。
喜欢:#iso8601?
我检查了 ruby 是否有特定的方法,但我没有找到任何方法。
目前我正在使用 date.iso8601 == date
来检查这个。
有什么好的方法吗?
编辑
解释我的环境,并改变问题的范围。
因此,我的项目将使用 js api FullCalendar,这就是我需要 iso8601 字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让 ActiveRecord 完成它们的工作并在我需要时间信息时对其进行操作。
我不太明白你的问题。我假设您想检查 DateTime 字符串是否是有效的 ISO8601 格式日期字符串。如果我错了请纠正我。
您可以使用 class 方法 Time.iso8601
和 Date.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 或不使用它,因此两种情况都有解决方案。