首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby检查datetime是否是iso8601并保存

Ruby检查datetime是否是iso8601并保存
EN

Stack Overflow用户
提问于 2015-07-25 14:06:34
回答 2查看 5.1K关注 0票数 5

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

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

编辑

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-25 14:36:42

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

您可以使用类方法Time.iso8601Date.iso8601。为了使用它们,您需要标准库中的“日期”和“时间”库。一个注意事项是,正如您从名称中看到的,它们不是谓词方法(没有?),而是在输入错误的字符串时引发带有“无效日期”消息的ArgumentError。因此,您需要添加一个begin救援块。例如:

代码语言:javascript
复制
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对象。

票数 8
EN

Stack Overflow用户

发布于 2022-01-16 16:22:10

Ruby 3.1:

代码语言:javascript
复制
begin
  invalid_date = '1970-01-32'
  Date.iso8601(invalid_date)
rescue Date::Error
  puts 'The date is invalid'
end

Rails 6.1:

如果属性在基础数据库中具有date类型,则无法将其设置为无效值。以下测试(用RSpec编写)通过:

代码语言:javascript
复制
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一起工作,因此这两种情况都有解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31627276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档