当前位置: 首页 > 后端技术 > Python

请谨慎使用datetime.utcnow()

时间:2023-03-26 16:57:46 Python

首先执行以下代码:importtimefromdatetimeimportdatetime,timezone,timedeltaprint(time.time())print(datetime.utcnow().timestamp())print(datetime.now(timezone.utc).timestamp())print(datetime.now(timezone(timedelta(hours=2))).timestamp())====output====1626687759.90810821626658959.9081081626687759.9081081626687759.908108发现,输出只有utcnow()不同。对比一下时差,可以发现时差刚好是8小时,而我的电脑所在的时区是东八区。原因是正如utcnow()文档所指出的那样,它返回naivetime,并且一个Naivedatetime实例被认为代表本地时间,因此当使用now(None)时,它的时间戳将完全偏离计算机的时区。这种奇怪的处理有历史原因。在从Python2到Python3的过渡过程中,datetime.timezone在3.2版本中被设计为一个新特性,因此有一个更加清晰明确的标记日期。时区。旧接口utcnow()保留了原来的处理方式。新时区模型的处理方式兼容Python2:====Python2====>>>fromdatetimeimportdatetime>>>fromdateutilimporttz>>>datetime(2021,5,1).astimezone(tz.UTC)追溯(最近调用最后一次):文件“”,第1行,在ValueError中:astimezone()不能应用于原始日期时间====Python3====>>>fromdatetimeimportdatetime>>>fromdateutilimporttz>>>datetime(2021,5,1).astimezone(tz.UTC)datetime.datetime(2021,5,1,4,0,tzinfo=tzutc())总结总而言之,utcnow()可能是一个常见的陷阱。我建议不要再使用utcnow()和utcfromtimestamp()了。