gpt4 book ai didi

ios - Rails API 与 NSDate - 比较日期时的精度问题

转载 作者:可可西里 更新时间:2023-11-01 06:06:21 28 4
gpt4 key购买 nike

我的 iOS 应用程序使用 Rails API,该 API 以 3 位微秒的精度输出 JSON 格式的日期,如下例所示。这是为相应的实体解析和保存的,NSDate 保留了预期的 3 位精度:

{ "updated_at": "2015-02-24T22:37:57.683Z" }

当我将此日期发送回 API 以查询记录时,我在数据库中的 updated_at 字段似乎有(至少)6 位精度:

>> my_model.update_at.strftime('%Y-%m-%d %H:%M:%S.%N')
>> 2015-02-24 22:37:57.683977000

这意味着每次我查询

>> ios_date = json_hash["updated_at"]
>> Model.where("updated_at > ?", ios_date)

我得到一条已存在于我的应用程序数据库中的记录。

我知道我可以在我的 ios_date 上加半秒钟来解决这个问题,但这显然是一个 hack。

谁能推荐在这种情况下最合适的行动方案是什么?

TIA

最佳答案

在这种情况下,我认为最好的方法是在数据库中存储和输出为 JSON 完全相同的东西,以避免任何转换或舍入问题之类的需要。正如我假设您想要保留 3 位微秒精度日期一样,我只是将您的数据库配置为也以该精度存储日期。

您可以使用迁移来修改 :created_at 和 :updated_at 字段的精度,如下所示:

class MicrosecondsMigration < ActiveRecord::Migration
def up
change_column :your_table, :created_at, :datetime, precision: 3
change_column :your_table, :updated_at, :datetime, precision: 3
end

def down
change_column :your_table, :created_at, :datetime
change_column :your_table, :updated_at, :datetime
end
end

我相信这将适用于主要数据库。 Check this commit at Rails其中添加了对 Postgresql 的支持。如果您使用的是 MySQL,请注意只有 MySQL 5.6.4 and above支持比秒更精确的 DATETIME。这不是你的问题,你已经说过你的数据库存储了 6 位精度的日期时间,但我认为这里值得注意。

我还可以想到其他方法,虽然看起来没有比上述方法更好,但它们也可能值得注意:

  • 使用一些 SQL 更改您的查询,从您的日期中删除多余的数字。我不建议走那条路:您需要在需要执行的每个查询中考虑到这一点。 buggy ,违背了 AR 的目的并且看起来很丑。
  • 手动向您的 ios_date 添加几毫秒,感觉更丑陋。
  • 当然,您始终可以更改 JSON API 以支持数据库处理的完整 6 位精度。正如我之前所说,我认为那不是你的意图。

关于ios - Rails API 与 NSDate - 比较日期时的精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28710363/

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