現在、私はログに記録しており、カスタムで独自のフォーマッターを使用していますformatTime()
:
def formatTime(self, _record, _datefmt):
t = datetime.datetime.now()
return t.strftime('%Y-%m-%d %H:%M:%S.%f')
私の問題は、マイクロ秒%f
が 6 桁であることです。マイクロ秒の最初の 3 桁のように、桁数を減らす方法はありますか?
最も簡単な方法は、スライスを使用して、マイクロ秒の最後の 3 桁を切り取ることです。
def format_time():
t = datetime.datetime.now()
s = t.strftime('%Y-%m-%d %H:%M:%S.%f')
return s[:-3]
チョップだけを強くお勧めします。タイムスタンプを切り刻むのではなく丸めるロギング コードを書いたことがありますが、丸めによって最後の桁が変更されると、実際にはやや混乱することがわかりました。特定のタイムスタンプで実行を停止した時限コードがありましたが、丸めのためにそのタイムスタンプのログ イベントがありました。チョップするだけで、よりシンプルで予測しやすくなります。
切り刻むだけでなく、実際に数値を丸めたい場合は、もう少し手間がかかりますが、恐ろしいことではありません。
def format_time():
t = datetime.datetime.now()
s = t.strftime('%Y-%m-%d %H:%M:%S.%f')
head = s[:-7] # everything up to the '.'
tail = s[-7:] # the '.' and the 6 digits after it
f = float(tail)
temp = "{:.03f}".format(f) # for Python 2.x: temp = "%.3f" % f
new_tail = temp[1:] # temp[0] is always '0'; get rid of it
return head + new_tail
明らかに、より少ない変数で上記を単純化できます。とても簡単にフォローできるようにしたかっただけです。
このメソッドは柔軟な精度を可能にし、大きすぎる精度を指定すると、マイクロ秒の値全体を消費します。
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
ため、このメソッドを意図的に使用することは避けました。この方法では、さらに変更したい場合に備えて、日付の内部も表示されます。
Decimal
丸めの例では、精度がモジュールの文字列ベースであることに注意してください。