【问题标题】:Comparing dates in 2 different formats to match or not with Ruby on Rails 6比较 2 种不同格式的日期以匹配或不匹配 Ruby on Rails 6
【发布时间】:2021-06-21 07:12:14
【问题描述】:

我正在尝试将来自 ActionMailbox mail.date 的日期与 我的 PostgreSQL 数据库表中的日期字段 进行比较,以检查是否已经有相同日期的帖子存在。我猜日期的格式不同,如何以相同的方式格式化它们以进行比较?时间部分无关紧要。


我猜来自电子邮件的日期格式如下。查看服务器上的日志

日期:2021 年 3 月 24 日,星期三 09:57:57 +0000


我在数据库中的日期格式如下。 Post.last in rails c的输出

日期:“2021-03-24 09:57:57.000000000 +0000


我需要检查日期是否匹配?

顺便说一句,有趣的是,我可以将mail.date 保存到 db 而无需任何特定格式,我猜它在保存之前已经格式化了。

【问题讨论】:

  • 可以使用Time.zone.parse将字符串转换为时间
  • posts.date 是什么数据库类型?

标签: ruby-on-rails datetime ruby-on-rails-6


【解决方案1】:

我在数据库中的日期格式如下。

数据库不会将时间戳或日期存储为字符串,they're stored as numbers。字符串格式仅适用于人类。除非您将日期存储为字符串。

我正在尝试将来自 ActionMailbox mail.date 的日期与我的 PostgreSQL 数据库表中的日期字段进行比较,以检查同一日期的帖子是否已经存在。

这些是标准日期格式,RFC 2822ISO 8601只要您的日期列具有日期类型,您就不需要转换它们。 Rails 或 Postgres 将负责转换。

Thing.where(date: mail.date)

但是,您的“日期”字段正在存储时间戳。它可能命名错误,也可能输入错误。如果您只想存储日期,请在迁移中使用 t.date


如果你这样做了,你会将它们parse 放入 Time 对象中,然后进行比较。

t1 = Time.zone.parse("Wed, 24 Mar 2021 09:57:57 +0000")
t2 = Time.zone.parse("2021-03-24 09:57:57.000000000 +0000")
p t1 == t2

顺便说一句,有趣的是,我可以将 mail.date 保存到 db 而无需任何特定格式,我猜它在保存之前会自行格式化。

Rails 类型转换是将 String 解析为 ActiveSupport::TimeWithZone 对象。

> thing = Thing.new
> thing.created_at = "Wed, 24 Mar 2021 09:57:57 +0000"
> thing.created_at
=> Wed, 24 Mar 2021 04:57:57.000000000 CDT -05:00
> thing.created_at.class
=> ActiveSupport::TimeWithZone

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多