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

如何将13位Unix时间戳转换为Ruby DateTime列的正确格式?

解决Ruby中13位Unix时间戳转DateTime列显示1970-01-01的问题

出现1970-01-01说明转换后的时间戳为0,核心原因是13位时间字符串转整数失败,或者赋值过程中类型解析出错,按以下步骤排查修复:

1. 确认原始时间戳的有效性

先打印原始字符串的实际内容,排查是否为空、包含非数字字符:

puts "原始时间戳字符串: #{msg.time_stamp_long.inspect}"

如果输出是空字符串、nil,或者包含字母/符号,转to_i会直接得到0,导致时间回到纪元起点。

2. 修复时间戳转换逻辑

如果原始字符串是有效的13位数字,优化转换代码,保留毫秒精度(可选),并且直接用Time对象赋值(多数ORM支持直接接收时间对象,避免字符串解析错误):

# 清洗字符串,确保只保留数字
cleaned_timestamp = msg.time_stamp_long.gsub(/\D/, '')
if cleaned_timestamp.length == 13
  millis = cleaned_timestamp.to_i
  # 转换为带毫秒的UTC时间
  converted_time = Time.at(millis / 1000, millis % 1000 * 1000).utc
  msg.time_stamp = converted_time
else
  # 处理无效格式,比如设为nil
  msg.time_stamp = nil
end
msg.save

3. 检查数据库列类型

确认time_stamp列的类型是datetime/timestamp,而非string或其他类型。如果是字符串类型,数据库可能无法正确解析时间字符串,导致存储为默认的1970-01-01。

4. 调试定位问题

如果仍有问题,逐步骤打印变量值,定位出错环节:

raw_str = msg.time_stamp_long
puts "原始字符串: #{raw_str}"
cleaned = raw_str.gsub(/\D/, '')
puts "清洗后字符串: #{cleaned}"
millis = cleaned.to_i
puts "毫秒数: #{millis}"
seconds = millis / 1000
puts "秒数: #{seconds}"
time_obj = Time.at(seconds).utc
puts "转换后的时间对象: #{time_obj}"
msg.time_stamp = time_obj
puts "赋值后模型字段值: #{msg.time_stamp}"
msg.save

内容的提问来源于stack exchange,提问作者bad-reputation

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:15:31