【问题标题】:A Time object being converted to epoch and back loses its milliseconds in Ruby一个 Time 对象在 Ruby 中被转换为 epoch 并返回它的毫秒数
【发布时间】:2025-12-26 16:15:12
【问题描述】:

我似乎在 Ruby 中发现了一个错误,但我不确定,所以我将其发布在这里。

我有一个 Rails 应用程序,它在给定时间戳后获取最新对象,这是页面上显示的最后一个对象的时间戳。

但由于某种原因,它总是返回最后一个重复的对象。过了一会儿,我们决定将其转换为 epoch,但没有成功。

在尝试找出问题所在之后,我想出了给定的代码:

require 'date'
DateTime.strptime("1358895408.915", "%s").strftime("%s")
# => "1358895408"

这不是应该工作吗?我错过了什么吗?如何安全地解析时间并保持毫秒不变?

【问题讨论】:

    标签: ruby time milliseconds


    【解决方案1】:

    (根据 Andrew Marshall 的建议编辑)

    使用Time.at。这将保留毫秒。它需要一个数字而不是一个字符串。

    Time.at(BigDecimal.new('1358895408.915'))
    .strftime("%s.%L")
    # => "1358895408.915"
    

    【讨论】:

    • 传递 BigDecimal(例如 Time.at(BigDecimal.new('1358895408.915')))可避免与浮点相关的精度问题。
    • 挑剔:Time.at 接受任何数字,而不仅仅是浮点数。 (+1 顺便说一句)