一、问题:项目遇到一个根据当前日期比较授权日期判断业务是否过期或者正常的需求,很简单的操作,拿当前日志跟授权日期比较,授权日期大于等于当前日期:正常;授权日期小于当前日期:过期;但是前段显示出现了问题。
二、排查:发现两个日期都是字符串并且格式还不一样(这个粗心哦)
bug修改前后是这样的:
其实很简单,但是问题来了,"2020/07/08"
和"2020-11-25"
前者日期大于后者,但是判断确是"2020/07/08"
大,两个字符串是怎样的比较的呢,这点可能好多人特别是初学者都会忽略掉。
三、分析:
理解原理和相关知识:
1.字符串按位比较,两个字符串第一位字符的ascii码谁大,字符串就大,不再比较后面的;第一个字符相同就比第二个字符串,以此类推,需要注意的是空格的ascii码是32,空(null)的ascii码是0。
2.ord 函数接受一个字符Python ord() 函数:
print(max(['1', '2', '3'])) # 3
print(max(['41', '1', '19'])) # 41
print(max(['11', '34', '5'])) # 5
print(ord('3')) # 51
print(ord('4')) # 52
print(ord('5')) # 53
打印:
PS E:\pyproject\demo01> python -u "e:\pyproject\demo01\venv\text01.py"
3
41
5
51
52
53
我们看到实际比较的是第一个字符的ascii码,谁大谁的字串就大
3.项目中出现的问题测试代码:
print(ord("/"))
print(ord("-"))
a = "2020/07/08" # 2020 /
b = "2020-11-25" # 2020 -
if a > b:
print('111')
elif a < b:
print('222')
else:
print('333')
打印:
PS E:\pyproject\demo01> python -u "e:\pyproject\demo01\venv\text01.py"
47
45
111
这下清楚了吧,a和b前面都是2020都一样,比较次序是2 0 2 0,发现都一样继续往后走,此时/的ascii码是47
,而-的ascii码是45
此时比较停止,a>b
。这就是我们项目里面的bug:"2020-11-25"<"2020/07/08"
的原因。当然,如果日期格式不错也不会引起这个问题,还是写代码太粗心。
友情链接