Этот метод позволяет гибко точность и будет потреблять всю величину микросекунд, если вы укажете слишком большую точность.
def formatTime(self, _record, _datefmt, precision=3):
dt = datetime.datetime.now()
us = str(dt.microsecond)
f = us[:precision] if len(us) > precision else us
return "%d-%d-%d %d:%d:%d.%d" % (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, int(f))
Этот метод реализует округление до 3 знаков после запятой:
import datetime
from decimal import *
def formatTime(self, _record, _datefmt, precision='0.001'):
dt = datetime.datetime.now()
seconds = float("%d.%d" % (dt.second, dt.microsecond))
return "%d-%d-%d %d:%d:%s" % (dt.year, dt.month, dt.day, dt.hour, dt.minute,
float(Decimal(seconds).quantize(Decimal(precision), rounding=ROUND_HALF_UP)))
я избегал использовать метод strftime
намеренно, потому что я предпочел бы не изменить полностью сериализованный объект DATETIME без повторного съема его. Этот способ также показывает внутреннюю дату, если вы хотите изменить ее дальше.
В примере округления обратите внимание, что точность основана на строках для модуля Decimal
.
Ваш метод округления не работает для меня, она производит этот результат: '» 2015-04-12 17: 09: 020.588'', секунды недействительны. – NuclearPeon
Я проверил ваш код в python 2.7.6 и python 3.4.0. Копировал и вставлял ваш код, одинаковый результат каждый раз. У вас есть 3 цифры в вашей области секунд. Я смотрю на код, и кажется, что ваш float (переменная 'f') накладывает на ведущее 0 перед десятичным (например:' 0.367'), которое добавляется в виде строки. То, что приводит к 0 в области секунд, начинается с отказа. – NuclearPeon
@NuclearPeon Прошу прощения. Вы определили реальную ошибку, которая доказывает, что я фактически не тестировал ее, прежде чем публиковать ее. Я отредактировал код, чтобы исправить ошибку, и теперь он должен работать для вас. Спасибо, что привлек это к моему вниманию. – steveha