Это правильное решение (AFAICT) для округления, если кто-то особенный об этом. Проблема со строковыми решениями - округление заканчивается огромной болью, потому что, если ваша дата (2015, 02, 28, 23, 59, 59, 999900)?
def round_microseconds(date, digits_to_show):
fraction = date.microsecond/1000000.0
rounded = round(fraction, digits_to_show)
if rounded < 1:
# format the number to have the required amount of decimal digits,
# this is important in case the rounded number is 0
hundredths = '{:.{prec}f}'.format(rounded, prec=digits_to_show)
hundredths = hundredths[2:] # trim off "0."
else:
# round up by adding a second to the datetime
date = date + datetime.timedelta(seconds=1)
hundredths = '0' * digits_to_show
return date.strftime("%Y%m%dT%H%M%S") + hundredths
Результаты тестов:
print round_microseconds(datetime.datetime(2015, 02, 28, 23, 59, 59, 999900), 3)
print round_microseconds(datetime.datetime(2015, 02, 28, 23, 59, 59, 999999), 6)
print round_microseconds(datetime.datetime(2015, 02, 28, 23, 59, 59, 5600), 2)
print round_microseconds(datetime.datetime(2015, 02, 28, 23, 59, 59, 5600), 3)
print round_microseconds(datetime.datetime(2015, 02, 28, 23, 59, 59, 5600), 4)
print round_microseconds(datetime.datetime(2015, 02, 28, 23, 59, 59, 5), 3)
print round_microseconds(datetime.datetime(2015, 02, 28, 23, 59, 59, 5), 5)
print round_microseconds(datetime.datetime(2015, 02, 28, 23, 59, 59, 5), 6)
20150301T000000000
20150228T235959999999
20150228T23595901
20150228T235959006
20150228T2359590056
20150228T235959000
20150228T23595900001
20150228T235959000005
Старые, более простое решение, но с ошибкой: она не будет выполнена, когда микросекунд является 995000 или выше, так что 0,5% от времени:
now = datetime.datetime.utcnow()
hundredths = str(round(now.microsecond, -4))[:2]
return now.strftime("%Y%m%dT%H%M%S") + hundredths
Как это работает:
- говорят
now
является datetime.datetime(2015, 2, 20, 19, 32, 48, 875912)
now.microsecond
является 875912
round(now.microsecond, -4)
является 880000,0. Используйте -4, потому что микросекунда находится в миллионных долях, поэтому она имеет 6 цифр, чтобы получить результат до двух цифр, которые нужно округлить с последних 4 цифр.
- , чтобы получить только первые две цифры этого числа как строку, так что «88». Обратите внимание, что 2 - 6-4, поэтому начальное число цифр минус цифры, которые вы округлили.
- Затем сцепить его со стандартным форматированием
now.strftime("%Y%m%dT%H%M%S")
Это может быть сделано немного более общим, как так:.
digits_to_show = 3
now = datetime.datetime.utcnow()
subsecond = str(round(now.microsecond, digits_to_show - 6))[:digits_to_show]
return now.strftime("%Y%m%dT%H%M%S") + subsecond
Заметим, что 'вернуть datetime.datetime.utcnow() STRFTIME ("% Y% m% dT% H% M% S% f ")' - более простой способ написать одно и то же. – jonrsharpe