几分之一秒和 pytz:你有更清洁的解决方案吗?

fractions of seconds and pytz: do you have a cleaner solution?

我在日志中有这样的时间:

1440498131.372625

我使用 pytz 所做的是

utc = pytz.utc
for anra in raFromMCCS:
    fsecs = float(anra.time)
    isecs = int(fsecs)
    isec2 = int(fsecs * 1000)
    dt = datetime.utcfromtimestamp(isecs).replace(tzinfo=utc)
    #print (dt.year)
    dt2 = utc.localize(datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, int((fsecs - isecs) * 1000000)))
    #      dt3 = datetime.utcfromtimestamp(isec2)
    print(dt, dt2)#, dt3)  

我离开了愚蠢的 dt3 尝试表明我对这里的各种事物都是新手。

我知道 dt2 可以满足我的需求,但这似乎是一种迂回的方式。如果您有更好的解决方案,请告诉我。

谢谢!

您可以将浮点数直接传递给 fromtimestamp()

d = datetime.fromtimestamp(1440498131.372625, utc)

如果您知道输入是 POSIX 时间(非 "right" 时区),那么您可以使用直接公式:

d = datetime(1970, 1, 1, tzinfo=utc) + timedelta(seconds=1440498131.372625)

它应该为输入时间戳提供一个可移植的(更宽的)范围。 Python 版本之间的舍入行为应该更加一致,请参阅 datetime.utcfromtimestamp rounds results incorrectly

如果输入是字符串;您可以使用 strptime('%f'):

解析微秒
from datetime import datetime, timedelta

seconds, dot, us = "1440498131.372625".partition('.')
d = datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=int(seconds))
if dot:
    d = d.replace(microsecond=datetime.strptime(us, '%f').microsecond)

其中 timezone.utc is defined here。如果使用少于 6 位数字表示微秒,它也适用,例如 ".372".

只有最后一个代码示例可以保证为任何输入时间戳保留微秒。