def format_time():
t = datetime.datetime.now()
s = t.strftime('%Y-%m-%d %H:%M:%S.%f')
head = s[:-7] # everything up to the '.'
tail = s[-7:] # the '.' and the 6 digits after it
f = float(tail)
temp = "{:.03f}".format(f) # for Python 2.x: temp = "%.3f" % f
new_tail = temp[1:] # temp[0] is always '0'; get rid of it
return head + new_tail
此方法应始终返回与此完全相同的时间戳(根据输入
dt
对象是否包含时区而定):2016-08-05T18:18:54.776+0000
它接受一个
datetime
对象作为输入(可以使用datetime.datetime.now()
生成)。要获得我的示例输出中的时区,您需要import pytz
并传递datetime.datetime.now(pytz.utc)
。我注意到,如果有一个方法(例如
0.870
变成0.87
),上面的其他一些方法会省略尾随的零,这会给我正在向其中输入这些时间戳的解析器带来问题。这个方法没有那个问题。最简单的方法是使用切片来切掉微秒的最后三个数字:
我强烈建议你切碎。我曾经写过一些日志代码,它舍入了时间戳而不是切碎,当舍入改变了最后一个数字时,我发现它实际上有点混乱。有一些定时代码在某个时间戳停止运行,但由于舍入,有一些日志事件具有该时间戳。更简单,更容易预测的只是砍。
如果你真的想把数字四舍五入而不仅仅是切碎,那就要多做一点工作,但并不可怕:
显然,你可以用更少的变量来简化上面的内容;我只是希望它很容易理解。
编辑:正如下面评论中指出的,当微秒值达到999500时,由于999.5四舍五入为1000(溢出),此解决方案(和上面的解决方案)的四舍五入会产生问题。
由于没有重新实现strftime以支持我们所需的格式(舍入导致的潜在溢出将需要传播到秒,然后是分钟等),因此仅将其截断到接受的答案中列出的前3位数字或使用类似的方法要简单得多:
'{:03}'.format(int(999999/1000))
——原答案保留在下面——
在我的例子中,我试图用毫秒格式化一个日期戳,格式是'ddd'。我得到毫秒的解决方案是使用
datetime
对象的microsecond
属性,将其除以1000.0,必要时用零填充,然后用格式将其舍入。看起来是这样的:相关问题 更多 >
编程相关推荐