Phương pháp này cho phép độ chính xác linh hoạt và sẽ tiêu thụ toàn bộ giá trị micro giây nếu bạn chỉ định độ chính xác quá lớn.
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))
Phương pháp này thực hiện làm tròn đến 3 chữ số thập phân:
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)))
Tôi tránh sử dụng phương pháp strftime
cố vì Tôi không muốn sửa đổi một đối tượng datetime đầy đủ serialized mà không revalidating nó. Cách này cũng hiển thị ngày tháng trong trường hợp bạn muốn sửa đổi thêm.
Trong ví dụ làm tròn, lưu ý rằng độ chính xác dựa trên chuỗi cho mô-đun Decimal
.
phương pháp làm tròn của bạn không làm việc cho tôi, nó tạo ra kết quả này: '' 2015-04-12 17: 09: 020.588'', giây không hợp lệ. – NuclearPeon
Tôi đã thử nghiệm mã của bạn trong python 2.7.6 và python 3.4.0. Sao chép và dán mã của bạn, cùng một kết quả mỗi lần. Bạn có 3 chữ số trong vùng giây của bạn. Tôi đang nhìn vào mã và có vẻ như phao ('f' variable) của bạn có đuôi 0 hàng đầu trước dấu thập phân (ví dụ:' 0.367') được nối thêm dưới dạng một chuỗi. Điều đó dẫn đầu 0 trong khu vực giây là nơi nó bắt đầu thất bại. – NuclearPeon
@NuclearPeon Tôi xin lỗi. Bạn đã xác định một lỗi thực sự, điều này chứng minh rằng tôi đã không thực sự kiểm tra điều này trước khi đăng nó. Tôi đã chỉnh sửa mã để sửa lỗi và nó sẽ làm việc cho bạn ngay bây giờ. Cảm ơn bạn đã mang đến sự chú ý của tôi. – steveha