如何显示0.01秒的时间?

时间:2015-02-20 16:44:41

标签: python python-2.7

以下代码返回当前时间的字符串到第二个:

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()))

2 个答案:

答案 0 :(得分:3)

你几乎就在那里。只需将[:-4]添加到您当前尝试删除数字的末尾,这样微秒就不再可见,只有百分之一秒。正如jonrsharpe的评论中所提到的,我宁愿重新格式化:

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

所有这一切都是从strftime切换(see formatting here)整个回归以获得所需的精确度。如果你想说毫秒,你可以用[:-4]取代[:-3]

编辑:在评论中提到了你可能想要正确的第100位舍入。如果是这样,我相信有一种更简单的方法可以做到这一点,但你可以实现这样的事情。如评论中所述,这会在DateTime末尾产生一个极值995xxx的错误值,但如果您真正关注极值,则应该使用替代方法,如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])

答案 1 :(得分: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. nowdatetime.datetime(2015, 2, 20, 19, 32, 48, 875912)
  2. now.microsecond是875912
  3. round(now.microsecond, -4)是880000.0。使用-4因为微秒是百万分之一所以它有6位数,要将结果变为2位数,你需要对最后4位数进行舍入。
  4. str(round(now.microsecond, -4))[:2]只获取该数字的前两位数字,因此为'88'。请注意,2是6-4,因此初始位数减去您已四舍五入的数字。
  5. 然后将其与now.strftime("%Y%m%dT%H%M%S")
  6. 的标准格式连接起来

    这可以更像一般:

      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