2017-08-01 2 views
1

Ich verwende Rails 5.0.1. Ich verwende den folgenden Code meiner Tabellendaten in CSV-Form zur Ausgabe ...Wie kann ich in Rails mein Datum als Zeit in Millisekunden in meiner CSV-Datei ausgeben?

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 

Das Problem ist, wenn mein Date (eine PostGres 9.5 Timestamp-Spalte) ausgegeben wird, es wird als

2017-08-01 20:00:09 UTC 

Ich möchte es als Zeit in Millisekunden ausgeben lassen. Wie kann ich die oben genannten Einstellungen so anpassen, dass die Zeit in Millisekunden und nicht im Standardformat angezeigt wird?

Antwort

1

Sie können einfach .to_i auf einem Datetime-Objekt aufrufen:

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

Der Zeitstempel ist die Sekunden seit der Epoche. Multiplizieren Sie es mit tausend und Sie erhalten Millisekunden.

In Ihrem Fall Sie einen Haken für diesen Fall machen muss:

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 

Das bedeutet, jedes Mal wenn ein Attribut gibt ein Datetime-Objekt, wird es zu einem Zeitstempel * 1000 konvertiert werden, wenn Sie nur filtern mögen einige attrs zu konvertieren DateTime -> Timestamp, testen Sie die attr mit einer Whitelist anstelle von attr_value 's Klasse zu testen.

+0

Ich bin unklar, wo ich das in den Code, den ich zur Verfügung gestellt habe, setzen würde. Ich gebe Linien zu einem csv aus mit der Zeile "csv << attributes.map {| attr | value.send (attr)}" – Dave

+0

Sie müssen einen Haken für bestimmte Werte machen, bevor Sie sie in der CSV ausgeben. Ich werde meinen Code in einer Sekunde aktualisieren – MrYoshiji

+0

In meinem Fall war die Klasse ein "ActiveSupport :: TimeWithZone". Durch den Einsatz hat alles funktioniert. – Dave

Verwandte Themen