以下代码返回当前时间的字符串到第二个:
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()))
答案 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
工作原理:
now
是datetime.datetime(2015, 2, 20, 19, 32, 48, 875912)
now.microsecond
是875912 round(now.microsecond, -4)
是880000.0。使用-4因为微秒是百万分之一所以它有6位数,要将结果变为2位数,你需要对最后4位数进行舍入。str(round(now.microsecond, -4))[:2]
只获取该数字的前两位数字,因此为'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