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

