如何在上传CSV文件时将UTC格式转换为人类可读的格式。
以下是我的模特&控制器,一切都还可以,CSV文件上传得很好。
我需要在上传CSV文件时将UTC转换为人类可读格式,这可以在Ruby on Rails上实现吗?我甚至不知道如何做到这一点我不知道。
模型
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
Product.create! row.to_hash
end
end
控制器
def import
Product.import(params[:file])
redirect_to root_url
end
CSV文件
-----------------------------
| name | date_utc |
-----------------------------
| John | 13123193563116372 |
数据库表
--------------------------------------
| id | name | date_utc | created_at |
--------------------------------------
| | | | |
--------------------------------------
答案 0 :(得分:0)
这可能会对您有所帮助:
CSV.foreach(file.path, headers: true) do |row|
product = Product.new
product.name = row[0]
product.date_utc = Time.at(row[1])
product.save
end
答案 1 :(得分:0)
这是我在剥离最后一位数字(2)并假设时间戳包括微秒后所得到的:
Time.at(1312319356311637 / (1000 * 1000)).utc.to_datetime
# => 2011-08-02T21:09:16+00:00
然后您的CSV解析将如下所示:
CSV.foreach(file.path, headers: true) do |row|
# Assuming it is a 17 digit number, we divide by 10 to remove the last digit.
parsed_time = Time.at(row[1] / (10 * 1000000)).utc.to_datetime
Product.create!(name: row[0], date_utc: parsed_time)
end
请注意,此解决方案仅在date_utc
长度为17位时才有效。而你将失去原始的精度。
如果这个假设是正确的话,我强烈建议与你从中获取数据的人进行交叉核对。
答案 2 :(得分:0)
我自己的解决方案
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
p_hash = Product.new
p_hash.name = row[0]
p_hash.date_utc = Time.at(row[1].to_i).strftime("%B %e, %Y at %I:%M :%S %p")
p_hash.save
end
end
我已考虑时间戳号码长度。
感谢大家的参与。