在Rails中,如何在CSV文件中以毫秒为单位输出日期?

时间:2017-08-01 20:02:52

标签: ruby-on-rails csv date ruby-on-rails-5 milliseconds

我正在使用Rails 5.0.1。我使用以下代码将表格数据输出为CSV格式...

  def self.to_csv(from_date, to_date)
    attributes = %w{index_date value} #customize columns here
    values = CryptoIndexValue.where('index_date >= ? and index_date <= ?', from_date, to_date)
                                     .order(index_date: :desc)

    CSV.generate(headers: true) do |csv|
      csv << attributes

      values.each do |value|
        csv << attributes.map{ |attr| value.send(attr) }
      end
    end
  end

问题是,当输出我的日期(PostGres 9.5时间戳列)时,输出为

2017-08-01 20:00:09 UTC

我希望以毫秒为单位输出时间。如何调整上面的时间以毫秒而不是默认日期格式输出我的时间?

1 个答案:

答案 0 :(得分:1)

您只需在DateTime对象上调用.to_i

timestamp = DateTime.now.to_i
# => 1501617998
DateTime.strptime(timestamp.to_s, '%s')
# => Tue, 01 Aug 2017 20:07:10 +0000

时间戳是Epoch以来的秒数。将它乘以一千,你得到几毫秒。

在你的情况下,你必须为这种情况勾选:

attr_values = attributes.map do |attr| 
  attr_value = value.send(attr)
  attr_value = attr_value.to_i * 1000 if attr_value.is_a?(DateTime)
  attr_value
end
csv << attr_values

这意味着每次属性返回DateTime对象时,它都会转换为时间戳* 1000.如果您只想过滤几个attrs来转换DateTime - &gt;时间戳,使用白名单测试attr,而不是测试attr_value的课程。