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
相关产品推荐
相关产品推荐

