为何datetime.datetime.now().timestamp()与utcnow().timestamp()结果不同?
为什么
utcnow().timestamp()和now().timestamp()会有差异? 这个问题其实是对Python datetime模块里几个方法的逻辑理解偏差,我来给你一步步拆解清楚:
核心逻辑先搞懂
首先得明确两个关键细节:
datetime.utcnow():返回的是当前UTC时间,但这个datetime对象是不带时区标记的(业内叫"naive datetime")。datetime.now():返回的是你本地时区(+2小时)的当前时间,同样也是不带时区标记的naive对象。
而timestamp()方法的本质是:不管这个datetime对象带不带时区,最终都会计算出该时间点对应的「自1970-01-01 UTC以来的秒数」。但对于naive对象,Python的处理逻辑有区别:
- 对于
utcnow()的结果:Python默认它就是UTC时间,直接计算秒数,这个是完全准确的。 - 对于
now()的结果:Python默认它是本地时区的时间,会先把它转换为UTC时间(也就是减去你的+2小时时区偏移),再计算秒数。
你的例子具体分析
看你给出的两个timestamp数值:
utcnow().timestamp()→ 1523622844.637763(对应UTC时间:2018-04-13 09:14:04.637763)now().timestamp()→ 1523630048.558158(对应UTC时间:2018-04-13 11:14:08.558158)
算一下差值:1523630048.558158 - 1523622844.637763 ≈ 7203.92秒,刚好是2小时加上约4秒的执行间隔。这说明你执行这两行代码的实际时间间隔是2小时左右,而不是你以为的“几乎同时执行”。扣除那4秒的代码执行时间差后,剩下的7200秒(2小时)就是两次调用的真实时间间隔,根本不是方法本身的差异。
验证方法:连续调用测试
如果想验证两个方法的一致性,你可以连续执行两行代码,尽量缩短时间间隔,比如:
import datetime import time # 连续调用,减少间隔 utc_ts = datetime.datetime.utcnow().timestamp() time.sleep(0.001) # 模拟极短的执行间隔 local_ts = datetime.datetime.now().timestamp() print(f"两次调用的timestamp差值:{abs(local_ts - utc_ts):.6f}")
正常情况下,差值只会有几毫秒(就是两次调用的时间差),因为now()的timestamp会自动转成UTC对应的秒数,和utcnow()的结果几乎一致。
额外建议:用带时区的datetime对象
为了彻底避免这类歧义,建议直接使用带时区信息的datetime对象,比如:
from datetime import datetime, timezone # 获取带UTC时区的当前时间 utc_dt = datetime.now(timezone.utc) # 获取带本地时区的当前时间 local_dt = datetime.now().astimezone() # 两者的timestamp会完全一致(忽略极短的执行间隔) print(utc_dt.timestamp()) print(local_dt.timestamp())
带时区标记的datetime对象不会有任何歧义,Python能明确知道每个时间点对应的UTC偏移,计算timestamp时绝对不会出错。
内容的提问来源于stack exchange,提问作者TeXnophobe
相关产品推荐
相关产品推荐

