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

Ruby中Unix时间戳转格式化日期出错,显示50057年如何解决?

问题分析与解决

你遇到的问题核心是时间戳单位不匹配:你使用的1517486994710是毫秒级的Unix时间戳,但Ruby的Time.at和DateTime.strptime的%s格式默认都是基于秒级的时间戳计算的。直接传入毫秒数相当于把时间放大了1000倍,自然会得到离谱的年份(50057)。

解决方案

方法1:将毫秒转换为秒(兼容所有Ruby版本)

把毫秒时间戳除以1000,转成秒级后再处理:

  • 使用Time.at:

    Time.at(1517486994710 / 1000.0).to_datetime
    # => #<DateTime: 2018-02-01T13:09:54+00:00 ((2458154j,47394s,710000000n),+0s,2299161j)>
    

    这里用1000.0做除法是为了保留毫秒部分,如果你不需要毫秒,用整数除法1517486994710 / 1000也可以。

  • 使用DateTime.strptime:

    DateTime.strptime((1517486994710 / 1000).to_s, '%s')
    # => #<DateTime: 2018-02-01T13:09:54+00:00 ((2458154j,47394s,0n),+0s,2299161j)>
    

    注意%s只能解析秒级的数字字符串,所以需要先把毫秒转成整数秒再转字符串。

方法2:直接指定时间单位(Ruby 2.6+)

Ruby 2.6及以上版本的Time.at支持通过unit参数直接指定时间单位,不用手动换算:

Time.at(1517486994710, unit: :millisecond).to_datetime
# => #<DateTime: 2018-02-01T13:09:54+00:00 ((2458154j,47394s,710000000n),+0s,2299161j)>

这种方式更直观,也不容易出错。

验证一下

我们可以反向验证:如果把正确的日期转成毫秒时间戳,应该和你提供的数值一致:

DateTime.parse('2018-02-01 13:09:54.71').strftime('%Q')
# => "1517486994710"

完全匹配,说明我们的转换是正确的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:10:17