ruby strftime выдает неправильное время

#ruby #time

#ruby #время

Вопрос:

Например, временная метка равна 1403667010.574 use Time.at(1403667010.574).strftime('%Y-%m-%d %H:%M:%S.%L %z') , затем resuit равен

 "2014-06-25 03:30:10.573  0000"
  

это потеря 1 мс в результате. Это ошибка ruby?

Для меня основная проблема заключается в том, что если я преобразую временную строку на Time.parse("2014-06-25 03:30:10.573 0000").to_f , результат станет 1403667010.573 . Это не эквивалентно исходному значению

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

1. Нет, это не ошибка ruby. Это ваша ошибка. Не приписывайте свою ошибку другим. Будьте более скромными.

2. Используйте Time.at (1403667010, 574000) может получить более точный результат

Ответ №1:

Вот как работают числа с плавающей запятой. Они приблизительно точны (не абсолютно).

 t = Time.at(1403667010.574)
t.strftime('%Y-%m-%d %H:%M:%S.%L %z') # => "2014-06-25 07:30:10.573  0400"

# more precision
t.strftime('%Y-%m-%d %H:%M:%S.%6N %z') # => "2014-06-25 07:30:10.573999  0400"

# even more precision
t.strftime('%Y-%m-%d %H:%M:%S.N %z') # => "2014-06-25 07:30:10.5739998817  0400"
  

Кроме того, это то, что в документации Time#strftime говорится о %L флаге:

%L — миллисекунда секунды (000..999) Цифры в миллисекундах усекаются, чтобы не создавать 1000.

Таким образом, значение .573999 просто усекается (не округляется) до .573

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

1. @sawa: без части точности с плавающей запятой было бы неясно, откуда ".573999" взялось.

2. @ Sergio: Я не понимаю, почему Time.parse(«2014-06-25 03:30:10.573 0000»). usec может получить правильную часть с плавающей запятой (574000), но Time.at (1403667010.574).usec не может (573999)

3. @Yehudi: если бы я узнал об этом, я бы пошел посмотреть на реализации Time.parse и Time.at . Что-то изменилось. (как минимум, один принимает строку, а другой — число)