ruby strptime format выдает ошибку для пользовательского формата «%d-%b-%y %I.%M.%S.%9N %p»

#ruby-on-rails #ruby #strptime

#ruby-on-rails #ruby #strptime

Вопрос:

Я пытаюсь проанализировать входящие csv-файлы, содержащие одно поле со строкой даты и времени, используя fluentd (написанный на ruby), но он выдает ошибку для предоставленного пользовательского формата времени.

Чтобы проверить, правильно ли я использую формат, я написал пример кода ruby (не программист ruby, поэтому использовал онлайн ruby IDE) и обнаружил, что формат хорошо работает, когда я пытаюсь писать с его использованием, но ruby выдает ошибку, когда я пытаюсь читать с использованием этого формата :

 [ code ]

require 'time'

time = Time.new
puts "writing time : "   time.strftime("%d-%b-%y %I.%M.%S.%9N %p")
newtime = Time.strptime("29-Sep-16 07.45.45.331680519 PM", "%d-%b-%y %I.%M.%S.%9N %p")
puts "reading time : "   newtime

[ output ]

sh-4.3$ ruby main.rb                                                                                                                                    
writing time : 29-Sep-16 05.47.36.206929933 PM                                                                                                          
/usr/share/ruby/time.rb:427:in `strptime': invalid strptime format - `%d-%b-%y %I.%M.%S.%9N %p' (ArgumentError)                                         
    from main.rb:10:in `<main>'  
  

Я проверил много сообщений, в которых люди находили проблемы с strptime, но не могли понять, как решить выше. Пожалуйста, предложите.

Комментарии:

1. %9N ? Что это? При отладке подобных проблем начинайте удалять вещи, пока они не заработают, затем возвращайте вещи, пока они не сломаются. Тогда вы нашли код проблемы.

2. @tadman : %9N указывает, что значение здесь равно наносекундам и имеет ширину 9 цифр. Я пробовал различные комбинации, такие как синтаксический анализ только даты и т. Д., Но strptime просто не работает. Проверил документацию для strptime, но похоже, что мое использование правильное, поэтому неясно, где ошибка.

3. @tadman: Похоже, вы были правы, указав. %9N, похоже, не поддерживается, хотя он упоминается здесь как поддерживаемый — ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html . Когда я изменил %9N на %N, синтаксический анализ прошел успешно. Спасибо.

Ответ №1:

Похоже, проблема была с %9N — он не поддерживается. Я изменил %9N на %N, и синтаксический анализ прошел успешно.
http://ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html задает форматы, такие как %3N, %9N и т.д., для синтаксического анализа миллисекунд, наносекунд.. но, похоже, это не работает. Спасибо tadman за подозрение в этом спецификаторе.