gpt4 book ai didi

ruby-on-rails - 有没有办法将 Rails 默认时间戳更改为 Y-m-d H :i:s (instead of Y-m-d H:i:s. u) 或者让 laravel 忽略 Y-m-d H :i:s. u 的小数部分?

转载 作者:行者123 更新时间:2023-11-29 13:12:45 26 4
gpt4 key购买 nike

我有两个应用程序使用相同的 postgres 数据库。一个 laravel 应用程序和一个 rails 应用程序。数据库中的当前数据为 Y-m-d H:i:s 格式,但每当 rails 添加记录时,格式为 Y-m-d H:i:s.u,其中包括毫秒。

如果 created_at 日期曾经在 laravel 中引用过,这会在 laravel 端导致以下错误 InvalidArgumentException Trailing data...

Laravel 模型可以改变它们的日期格式,所以我可以包含使其符合 Y-m-d H:i:s.u 然后我需要更新所有记录以在 created_at 日期中包含毫秒数(和任何其他时间戳)。不幸的是,当我为 laravel 模型指定格式为 Y-m-d H:i:s 时,它不会忽略小数。这就是为什么我现在正在寻找默认 rails 以 Y-m-d H:i:s 格式保存的方法,而不是包括毫秒。那么 Rails 和 Laravel 应用程序将使用相同的格式,并且不会有任何冲突。

我知道我可以进入数据库并将列类型更改为截断小数的时间戳 (0),但我更愿意更改框架正在保存的格式,而不是更改数据库将接受的格式。

Y-m-d H:i:sY-m-d H:i:s.u 都是有效的时间戳...如果我能让 Rails 使用 Y-m-d H :i:s 格式或让 Laravel 在查看时间戳时忽略 .u 以防止尾随数据错误,我会很清楚。

有没有办法更改 Rails 将时间戳保存到数据库的默认格式?

有没有一种方法可以让 Larave Carbon 忽略 Y-m-d H:i:s.u 格式的时间戳的小数部分?

谢谢

最佳答案

Rails 端的解决方案

Rails (5.2) 中使用的 ActiveRecord 似乎在保存 created_atupdated_at 或数据库中接受子的任何其他时间戳列时自动将小数秒添加到 1 毫秒-seconds,在文件 active_record/connection_adapters/abstract/quoting.rb

中定义

解决方法是这样的。在访问模型(例如 ApplicationRecord 模型文件)时始终由 Rails 读取的任何文件的顶层添加此行。

Time::DATE_FORMATS[:db] = '%Y-%m-%d %H:%M:%S.000000000'

module ActiveRecord::ConnectionAdapters::Quoting
alias_method :quoted_date_orig, :quoted_date if ! self.method_defined?(:quoted_date_orig)

def quoted_date(*rest, **kwd)
quoted = quoted_date_orig(*rest, **kwd)
quoted.sub(/(\.\d*)\.\d{6}$/, '\1')
end
end

创建新记录后,您可以从 Rails 控制台确认,

MyModel.last.created_at.nsec  # => 0

或者直接访问数据库以查看它。

警告

此更改不仅会影响 created_atupdated_at,还会影响数据库中的所有其他时间戳列。我认为您仍然可以通过将 String 而不是 Time 实例设置为模型实例来将值保存到此类列,如 my_model.col_msec_desired = "2018-01-02 03:04 :05.678";那么 Time::DATE_FORMATS[:db] 将不会在保存记录时被引用。

Laravel 端的潜在解决方案

在撰写本文时(2018-10-18),这可能很棘手,但根据 very recent Laracast post by cmbertsch01,一项工作似乎正在进行中

(注意:根据评论在原始帖子后的第二天进行了重大更新。)

关于ruby-on-rails - 有没有办法将 Rails 默认时间戳更改为 Y-m-d H :i:s (instead of Y-m-d H:i:s. u) 或者让 laravel 忽略 Y-m-d H :i:s. u 的小数部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52864581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com