2016-12-08 2 views
0

Как конвертировать формат UTC в формат для чтения в формате MP3 при загрузке CSV-файлов.Как конвертировать UTC в человекообразный формат при загрузке CSV-файлов

Ниже приведена моя модель & Контроллер, все в порядке, файлы CSV загружаются красиво.

Мне нужно преобразовать UTC в формат для чтения человеком при загрузке CSV-файлов, возможно ли это на 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 | 
-------------------------------------- 
| |  |   |   | 
-------------------------------------- 
+0

'Time.at (13123193563116372) .utc.to_datetime' =>' Thu, 14 июня 417827 09:18:36 + 0000', который является безумным. Вы уверены, что у вас есть правильные данные в CSV? :) –

+1

Я бы сказал, что 'UTC' часовой пояс, а не формат представления. Поэтому число не имеет смысла в контексте «UTC». Это может быть временная метка, но это путь к большой, чтобы быть обычной временной отметкой unix. Пожалуйста, объясните, какой тип отметки времени и номер ожидаемого результата. – spickermann

+0

@AndreyDeineko На самом деле это присылает мне мой клиент и он взят из своих журналов браузера. –

ответ

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 

Я рассмотрел длина номера временной метки.

Спасибо за участие всем.

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 
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 цифр. И вы потеряете оригинальную точность. Я настоятельно рекомендую перекрестно проверять людей, получающих ваши данные, если это предположение верно.

Смежные вопросы