几分之一秒和 pytz:你有更清洁的解决方案吗?
Posted
技术标签:
【中文标题】几分之一秒和 pytz:你有更清洁的解决方案吗?【英文标题】:fractions of seconds and pytz: do you have a cleaner solution? 【发布时间】:2015-12-11 02:00:08 【问题描述】:我在日志中的一些时间看起来像这样:
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 给了我我想要的东西,但它似乎是一种迂回的方式到达那里。如果您有更好的解决方案,请告诉我。
谢谢!
【问题讨论】:
您要解决的问题是什么? 【参考方案1】:您可以将浮点数直接传递给fromtimestamp()
:
d = datetime.fromtimestamp(1440498131.372625, utc)
如果您知道输入是 POSIX 时间(非“正确”时区),那么您可以使用直接公式:
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"
,它也可以工作。
只有最后一个代码示例保证为任何输入时间戳保留微秒。
【讨论】:
谢谢。第一个有效,或者至少它给了我与我第一种方式相同的结果(输出差异)。非常感谢。 对不起,对未来参考的另一条评论:python3.4 而且,我最终使用 return datetime(1970, 1, 1, tzinfo=utc) + timedelta(seconds=float(timeInSecs)) 因为您提供的参考说明这是另一种方式的期望行为......再次,差异显示与我原来的方式相同的结果,所以我坚持这个。 @evernoob:要了解为什么在一般情况下应该使用整数而不是浮点数,请考虑int((datetime.max - datetime.min) / timedelta(microseconds=1))
与 (datetime.max - datetime.min) // timedelta(microseconds=1)
(前者不精确)。虽然对于日常时间戳的范围,浮点数应该有足够的精度。以上是关于几分之一秒和 pytz:你有更清洁的解决方案吗?的主要内容,如果未能解决你的问题,请参考以下文章
iPhone:MPMoviePlayer 最初在几分之一秒内显示黑色背景