#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
. Что-то изменилось. (как минимум, один принимает строку, а другой — число)