如何在上传CSV文件时将UTC转换为人类可读格式

时间:2016-12-08 10:05:36

标签: ruby-on-rails ruby ruby-on-rails-5

如何在上传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 |
--------------------------------------
|    |      |          |            |
--------------------------------------

3 个答案:

答案 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

我已考虑时间戳号码长度。

感谢大家的参与。