You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中如何从毫秒级Unix时间戳反向解析得到DateTime对象

Ruby 13位毫秒级Unix时间戳反向解析为DateTime的实现方案

Ruby标准库自带的DateTime.strptime方法原生不支持%L毫秒格式占位符,直接传入%s%L作为格式串解析13位毫秒时间戳会抛出解析错误,可通过以下几种无额外依赖的标准库方案实现正确转换:

方案1:拆分字符串解析小数秒

13位毫秒时间戳结构固定:前10位为1970年1月1日起的累计秒数,后3位为毫秒值。%s格式符原生支持解析带小数的秒值,因此只需将毫秒部分转为秒的小数部分拼接后解析即可:

ts = "1656279075654"
sec_part = ts[0..9]
milli_part = ts[10..12]
datetime = DateTime.strptime("#{sec_part}.#{milli_part}", "%s")

# 验证:转换回字符串和原始值一致
datetime.strftime("%s%L") # => "1656279075654"

方案2:借助Time类中转转换

Time.at原生支持毫秒级时间参数,解析后再转为DateTime对象即可,代码更简洁:

ts = "1656279075654"
# Ruby 2.5及以上版本支持直接指定时间单位,显式指定UTC时区避免本地时区偏移
datetime = Time.at(ts.to_i, in: "+00:00", unit: :millisecond).to_datetime

如果是2.5以下的老版本Ruby,可以通过传入有理数参数避免精度丢失:

# 老版本Ruby兼容写法
datetime = Time.at(ts.to_i / 1000r, in: "+00:00").to_datetime

注意:如果不显式指定时区参数,Time.at会默认使用系统本地时区,和DateTime默认使用UTC时区的行为不一致,跨时区部署场景建议显式传入时区参数。

框架环境快捷方案

如果是Rails项目,ActiveSupport对时间解析做了扩展,可直接使用内置的毫秒时间戳占位符%Q解析:

datetime = DateTime.strptime("1656279075654", "%Q")

内容的提问来源于stack exchange,提问作者Jonathan Boccara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:36:26