我写了这个代码
import time
import datetime
import os
import msvcrt as m
while True:
try:
os.system("cls")
delivery = input("Insert delivery date (dd/mm/aaaa): ")
dateDelivery = datetime.datetime.strptime(delivery, "%d%m%Y").strftime("%d/%m/%Y")
dateInput = time.strftime("%d/%m/%Y")
except ValueError:
print("nWrong formatnnTry again")
m.getch()
continue
if dateDelivery <= dateInput:
print("nThe inserted date has already pastnn", dateDelivery, "nnla Actual date: ", dateInput)
m.getch()
continue
else:
break
print("Input date: ", dateInput, "nDelivery date: ", dateDelivery)
它需要比较两个日期:发送交货的日期和实际日期,所以如果发送交货的时间是过去的日期,程序会发送一条消息表明这一点。
程序运行良好,但如果我在将来插入一些日期,程序会将它们识别为过去的日期。试试12122016。
我是一个代码新手,所以我认为这是一个非常简单的错误。
对不起我的英语,我也在努力提高。
感谢所有
您正在比较转换为string类型的两个日期,因此比较是字典式的。您应该使用日期时间类型,如下所示:
dateDelivery = datetime.datetime.strptime(delivery,"%d%m%Y")
dateInput = datetime.datetime.now()
您可以通过打印变量的类型来看到差异:
print(type(dateDelivery))
print(type(dateInput))
更改前后。
每次获得日期时间值时,都会使用strftime("%d/%m/%Y")
将其转换为字符串。因此,当您比较dateDelivery
和dateInput
时,您比较的是两段文本,而不是日期时间值。
当使用dd-mm-yyyy
格式时,文本的排序并不总是与日期时间排序相对应(如果您真的想,可以使用具有正确排序的yyyy-mm-dd
格式)。
例如:
>>> "01/01/2015" <= "01/01/2016"
True
>>> "02/01/2015" <= "01/01/2016" # wrong?
False
因此,在比较日期之前进行询问时,不应将它们转换为字符串。
dateDelivery = datetime.datetime.strptime(delivery, "%d%m%Y")
dateInput = datetime.datetime.now()
然后,当向用户显示结果时,您可以将它们转换为字符串:
humanDateInput = dateInput.strftime("%d/%m/%Y")
humanDateDelivery = dateDelivery.strftime("%d/%m/%Y")
print("Input date:", humanDateInput)
print("Delivery date:", humanDateDelivery)