2015-02-20 4 views
1

Следующий код возвращает строку текущего времени на второй:Как отображать время до 0,01 секунды?

return("{:%Y%m%dT%H%M%S%}".format(datetime.datetime.utcnow())) 

Как вернуть строку текущего времени до сотых (0,01) секунды?

Я пробовал следующее, но не смог найти способ отображать только 2 десятичных знака дробной секунды.

return("{:%Y%m%dT%H%M%S%f}".format(datetime.datetime.utcnow())) 
+4

Заметим, что 'вернуть datetime.datetime.utcnow() STRFTIME ("% Y% m% dT% H% M% S% f ")' - более простой способ написать одно и то же. – jonrsharpe

ответ

3

Вы почти у цели. Просто добавьте [:-4] в конец того, что вы в настоящее время пытаетесь удалить цифры, чтобы микросекунды больше не были видны, только сотые доли секунды. Как уже отмечалось в комментариях по jonrsharpe, я предпочел бы переформатировать, как это, хотя:

return datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%S%f")[:-4] 

Все это проделывается нарезка (see formatting here) ваш весь доход от strftime, чтобы получить нужную точность. Если бы вы хотели сказать миллисекунды, вы бы, например, заменили [:-4] на [:-3].

EDIT: Это было поднято в комментариях, вы можете захотеть правильного округления сотых мест. Если это так, я уверен, что есть более простой способ сделать это, но вы можете реализовать что-то вроде этого. Это приведет к некорректному значению для экстремального значения 995xxx в конце вашего DateTime, как указано в комментариях, но если экстремальное значение действительно вас беспокоит, вы, вероятно, должны использовать альтернативный метод, например, решение Jarek.

now = datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%S%f") 
return str(now[:-9] + str(round(int(now[-9:-3]), -1))[:-1]) 
+0

Если вы нарезаете строку формата, а не возвращаете из 'strftime', вы получите очень разные результаты! – jonrsharpe

+0

@jonrsharpe Вы правы, большое спасибо. – HavelTheGreat

+1

Технически, это не округляет сотую цифру должным образом. Например. 0,945361 с будет отображаться как 0,94, а не 0,95. Округление не упоминалось ОП, но, возможно, стоит отметить. –

3

Это правильное решение (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 

Как это работает:

  1. говорят now является datetime.datetime(2015, 2, 20, 19, 32, 48, 875912)
  2. now.microsecond является 875912
  3. round(now.microsecond, -4) является 880000,0. Используйте -4, потому что микросекунда находится в миллионных долях, поэтому она имеет 6 цифр, чтобы получить результат до двух цифр, которые нужно округлить с последних 4 цифр.
  4. , чтобы получить только первые две цифры этого числа как строку, так что «88». Обратите внимание, что 2 - 6-4, поэтому начальное число цифр минус цифры, которые вы округлили.
  5. Затем сцепить его со стандартным форматированием 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 
Смежные вопросы