【问题标题】:How to convert UTC to human readable format when uploading CSV files上传 CSV 文件时如何将 UTC 转换为人类可读的格式
【发布时间】:2016-12-08 10:05:35
【问题描述】:

上传 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 |
--------------------------------------
|    |      |          |            |
--------------------------------------

【问题讨论】:

  • Time.at(13123193563116372).utc.to_datetime => Thu, 14 Jun 417827 09:18:36 +0000 这有点疯狂。您确定 CSV 中的数据正确吗? :)
  • 我认为UTC 是一个时区,而不是一种表示格式。因此,该数字在UTC 的上下文中毫无意义。它可能是一个时间戳,但它是一个普通的 unix 时间戳。请说明该示例编号是哪种时间戳以及预期的输出可能是什么样的。
  • @AndreyDeineko 实际上这是把我的客户发给我,他是从他的浏览器日志中获取的。
  • @spickermann 我需要这个数字的人类可读格式,它是时间戳,从浏览器日志中保存
  • 如何在浏览器日志中生成时间戳?

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


【解决方案1】:

这可能对你有帮助:

 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

【讨论】:

    【解决方案2】:

    这是我去掉最后一个数字 (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 位的情况。你会失去原来的精度。 如果这个假设是正确的,我强烈建议与您获取数据的人进行交叉检查。

    【讨论】:

      【解决方案3】:

      我自己的解决方案

      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
      

      我已经考虑过时间戳编号长度。

      感谢大家的参与。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-12
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2011-05-29
        相关资源
        最近更新 更多