解决python 使用time.loacltime()获取当前时间不准问题
作为python小白的我,果然容易犯很多低级的错误或者说又不自觉想当然了,导致又花费了好长时间处理BUG。
我在我的爬虫代码开始时记录了程序开始时间,代码如下:
startTime = time.strftime("%Y-%m-%d %H:%m", time.localtime())
相信大佬一眼就能看出我这段代码中存在的问题,但作为小白的我一开始对这个我对照着百度到的时间转化格式类推出来的代码自豪无比:
time.strftime("%Y-%m-%d", time.localtime())
运行程序没报错,而且最巧合的是运行当时出来的结果和电脑显示的一致,完美,ok,问题解决,运行爬虫没问题就放一旁没管了。
我的爬虫设置的运行频率是每10分钟运行一次(包含爬取一遍的时间),到晚上9点半结束,因为是小白就简单粗暴的通过计算白天开始时间到21:30用多少个10分钟,然后用for循环将程序运行这么多遍,当天晚上满心欢喜的打开程序发现都快10点了竟然还在运行最后一遍,因为我爬虫的性质这个时候再爬毫无意义,所以我就直接手动停止了,并且以为是四舍五入的原因,没有去追根寻底,实时表明程序任何不符合预期的现象发生都意味着自己的代码在某些地方有问题,需要我们去追根到底。
回到本文的问题所在,第二天程序偏差更大了,这次我无法忽视了,就将程序停了,将这段代码单独运行了一下,果然时间对不上,立马跑去问度娘,搜到说可能是时区问题,却都没有给出具体怎么加时区的方法,无奈只能搜寻其他回答,试过一下几种方法
startTime = time.strftime("%Y-%m-%d %H:%m", time.now()) #报错
startTime = time.strftime("%Y-%m-%d %H:%m", time.localtime(0)) #报错
startTime = time.strftime("%Y-%m-%d %H:%m", time.localtime(tm_isdst=0))#报错
startTime = time.strftime("%Y-%m-%d %H:%m", time.localtime(sece)) #报错
startTime = time.strftime("%Y-%m-%d %H:%m", time.localtime(time.time()))#没报错但时间还是对不上
以上就是我根据百度到的进行的各种尝试,还是报错,就试着打开time的源码查看,翻到这块代码介绍才恍然大悟
Commonly used format codes:
%Y Year with century as a decimal number.
%m Month as a decimal number [01,12].
%d Day of the month as a decimal number [01,31].
%H Hour (24-hour clock) as a decimal number [00,23].
%M Minute as a decimal number [00,59].
%S Second as a decimal number [00,61].
%z Time zone offset from UTC.
%a Locale's abbreviated weekday name.
%A Locale's full weekday name.
%b Locale's abbreviated month name.
%B Locale's full month name.
%c Locale's appropriate date and time representation.
%I Hour (12-hour clock) as a decimal number [01,12].
%p Locale's equivalent of either AM or PM.
在我使用"%Y-%m-%d %H:%m"
格式化日期在表达分钟时用的是小写m,而在strftime()
函数中m表示月份,大写的M才是表示分钟,所以导致时间不一致,将m改成M一运行程序:
startTime = time.strftime("%Y-%m-%d %H:%M", time.localtime())
瞬间热泪盈眶,总算对了。
- 总结
编程的时候一定要细心细心再细心,不能想当然,遇到异常要追根溯源,才能及早发现问题并纠正。希望我犯的低级错误大家不要犯,若不小心出现和我一样的问题,也能快速定位到问题所在!
一次BUG一次成长,又学到新的知识了!