Este método permite una precisión flexible y consumirá el valor de microsegundos completo si especifica una precisión demasiado grande.
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))
Este método implementa el redondeo a 3 decimales:
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)))
Me evitado usando el método strftime
propósito porque yo preferiría no modificar un objeto de fecha y hora totalmente serializado sin revalidar ella. De esta forma, también se muestran los datos internos de la fecha en caso de que quiera modificarla más.
En el ejemplo de redondeo, tenga en cuenta que la precisión se basa en cadenas para el módulo Decimal
.
Su método de redondeo no funciona para mí, se produce el siguiente resultado: '' 2015-04-12 17: 09: 020.588'', los segundos no son válidos. – NuclearPeon
Probé tu código en python 2.7.6 y python 3.4.0. Copió y pegó su código, el mismo resultado cada vez. Tienes 3 dígitos en tu área de segundos. Estoy mirando el código y parece que tu flotación (variable 'f') se pega en el 0 que está delante del decimal (por ej .:' 0.367') que se agrega como una cadena. Ese 0 en el área de los segundos es donde comienza a fallar. – NuclearPeon
@NuclearPeon Me disculpo. Identificó un error real, lo que prueba que en realidad no lo probé antes de publicarlo. He editado el código para corregir el error y debería funcionar para usted ahora. Gracias por traer esto a mi atención. – steveha