为何Python的time_machine模块返回错误日期?结果比设置值早一天
time_machine返回日期比设定早一天的问题解决
问题出在哪?
time_machine.travel() 默认使用UTC时区,而 dt.date.today() 会根据你的本地系统时区返回日期。你传入的 dt.datetime(2024,7,24) 不带时区信息,会被time_machine识别为UTC时间。如果你的本地时区在UTC以东(比如国内常用的东八区),UTC的2024-07-24零点对应本地的2024-07-23下午/晚上,此时调用 dt.date.today() 自然会返回前一天的日期。
三种解决办法
办法1:让time_machine使用本地时区
给 travel() 指定本地时区,Python3.9+可以用自带的zoneinfo,低版本可用pytz:
import time_machine import datetime as dt from zoneinfo import ZoneInfo # Python3.9+ 自带,低版本替换为pytz def timemachine(): # 替换成你的实际时区,比如"America/New_York" local_tz = ZoneInfo("Asia/Shanghai") # 给目标时间加上本地时区信息 target_dt = dt.datetime(2024, 7, 24, tzinfo=local_tz) with time_machine.travel(target_dt, tick=False): return dt.date.today().isoformat()
办法2:改用UTC日期方法
在time_machine的上下文里,用UTC的日期获取方式代替本地的:
def timemachine(): with time_machine.travel(dt.datetime(2024, 7, 24), tick=False): # 用utcnow()获取UTC时间再提取日期 return dt.datetime.utcnow().date().isoformat()
办法3:直接传入带时区的datetime对象
给目标datetime添加时区信息,确保time_machine识别为本地时间:
import time_machine import datetime as dt import pytz # 适合Python3.8及以下版本 def timemachine(): local_tz = pytz.timezone("Asia/Shanghai") # 本地化目标时间,避免时区歧义 target_dt = local_tz.localize(dt.datetime(2024, 7, 24), is_dst=None) with time_machine.travel(target_dt, tick=False): return dt.date.today().isoformat()
测试修改后的完整代码
以办法1的代码为例,完整运行代码如下:
import time_machine import datetime as dt from zoneinfo import ZoneInfo def main(): print(timemachine()) print(today_time()) def timemachine(): local_tz = ZoneInfo("Asia/Shanghai") target_dt = dt.datetime(2024, 7, 24, tzinfo=local_tz) with time_machine.travel(target_dt, tick=False): return dt.date.today().isoformat() def today_time(): return dt.datetime.today() if __name__ == "__main__": main()
运行后会得到预期输出:
2024-07-24 2024-07-25 11:38:30.354514
内容的提问来源于stack exchange,提问作者l'anonyme
相关产品推荐
相关产品推荐

