2017-08-01 3 views
1

私はRails 5.0.1を使用しています。私はこの問題は、それがRailsでは、CSVファイルで日付をミリ秒単位で出力するにはどうすればよいですか?

2017-08-01 20:00:09 UTC 
として出力され、私の日付(Postgresの9.5タイムスタンプ列)が出力されると、ある

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 

... CSV形式に出力する私のテーブルのデータを次のコードを使用します

出力をミリ秒単位で取得したいと思います。既定の日付形式ではなく、ミリ秒単位で時刻を出力するには、上記の設定を調整するにはどうすればよいですか。

答えて

1

あなたは、単にDateTimeオブジェクトに.to_iを呼び出すことができます。

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

タイムスタンプはエポックからの秒です。それを1000倍にすると、ミリ秒単位で取得できます。

お使いの場合には

、あなたがこのような場合のためのフックを作る必要があります:あなたが唯一のフィルタリングする場合は

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に変換されます。 DateTime - >タイムスタンプに変換するattrsは、attr_valueのクラスではなく、attrをホワイトリストでテストしてください。

+0

私が提供しているコードで、どこにそれを置くのかはっきりしていません。 "csv << attributes.map {| attr | value.send(attr)}"という行を使ってCSVに行を出力しています " – Dave

+0

CSVで出力する前に特定の値をフックする必要があります。私のコードを1秒で更新します – MrYoshiji

+0

私の場合、クラスは "ActiveSupport :: TimeWithZone"でした。それを代用するとすべてがうまくいった。 – Dave

関連する問題