日期时间:舍入/修剪以微秒为单位的位数

2024-09-28 17:22:43 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我正在记录内容,我正在使用自己的格式化程序和自定义的formatTime()

def formatTime(self, _record, _datefmt):
    t = datetime.datetime.now()
    return t.strftime('%Y-%m-%d %H:%M:%S.%f')

我的问题是微秒是6位数。有没有可能像微秒的前三位那样,吐出更少的数字?


Tags: self程序内容datetimereturndef记录数字
3条回答

此方法应始终返回与此完全相同的时间戳(根据输入dt对象是否包含时区而定):

2016-08-05T18:18:54.776+0000

它接受一个datetime对象作为输入(可以使用datetime.datetime.now()生成)。要获得我的示例输出中的时区,您需要import pytz并传递datetime.datetime.now(pytz.utc)

import pytz, datetime


time_format(datetime.datetime.now(pytz.utc))

def time_format(dt):
    return "%s:%.3f%s" % (
        dt.strftime('%Y-%m-%dT%H:%M'),
        float("%.3f" % (dt.second + dt.microsecond / 1e6)),
        dt.strftime('%z')
    )   

我注意到,如果有一个方法(例如0.870变成0.87),上面的其他一些方法会省略尾随的零,这会给我正在向其中输入这些时间戳的解析器带来问题。这个方法没有那个问题。

最简单的方法是使用切片来切掉微秒的最后三个数字:

def format_time():
    t = datetime.datetime.now()
    s = t.strftime('%Y-%m-%d %H:%M:%S.%f')
    return s[:-3]

我强烈建议你切碎。我曾经写过一些日志代码,它舍入了时间戳而不是切碎,当舍入改变了最后一个数字时,我发现它实际上有点混乱。有一些定时代码在某个时间戳停止运行,但由于舍入,有一些日志事件具有该时间戳。更简单,更容易预测的只是砍。

如果你真的想把数字四舍五入而不仅仅是切碎,那就要多做一点工作,但并不可怕:

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

显然,你可以用更少的变量来简化上面的内容;我只是希望它很容易理解。

编辑:正如下面评论中指出的,当微秒值达到999500时,由于999.5四舍五入为1000(溢出),此解决方案(和上面的解决方案)的四舍五入会产生问题。

由于没有重新实现strftime以支持我们所需的格式(舍入导致的潜在溢出将需要传播到秒,然后是分钟等),因此仅将其截断到接受的答案中列出的前3位数字或使用类似的方法要简单得多:

'{:03}'.format(int(999999/1000))

——原答案保留在下面——

在我的例子中,我试图用毫秒格式化一个日期戳,格式是'ddd'。我得到毫秒的解决方案是使用datetime对象的microsecond属性,将其除以1000.0,必要时用零填充,然后用格式将其舍入。看起来是这样的:

'{:03.0f}'.format(datetime.now().microsecond / 1000.0)
# Produces: '033', '499', etc.

相关问题 更多 >