Python: сравнение дат и распечатка первой
Вероятно, это очень просто, но я новичок в python и хотел сравнить даты рождения, предложив пользователю ввести дату в формате MM-DD. Нет года, потому что это текущий год (2011). Затем пользователю будет предложено ввести другую дату, а затем программа сравнит ее, чтобы узнать, какая из них является первой. Затем он печатает предыдущий день и название дня недели.
Пример: 02-10 раньше, чем 03-11. 02-10 в четверг и 03-11 в пятницу
Я только начал изучать модули и знаю, что должен использовать модуль datetime, класс date и strftime, чтобы получить название дня недели. Я действительно не знаю, как все это соединить.
Если кто-то может помочь мне начать, это действительно поможет! У меня есть несколько кусочков вместе:
import datetime
def getDate():
while true:
birthday1 = raw_input("Please enter your birthday (MM-DD): ")
try:
userInput = datetime.date.strftime(birthday1, "%m-%d")
except:
print "Please enter a date"
return userInput
birthday2 = raw_input("Please enter another date (MM-DD): ")
if birthday1 > birthday2:
print "birthday1 is older"
elif birthday1 < birthday2:
print "birthday2 is older"
else:
print "same age"
3 ответа
В коде, который вы разместили, я вижу несколько проблем. Я надеюсь, что будет полезно указать на некоторые из них и предоставить несколько переписанную версию:
- Отступы повреждены, но я думаю, что это может быть просто проблема вставки в переполнение стека
strftime
для форматирования времени, а не для их анализа. Ты хочешьstrptime
вместо.- В Python
True
имеет капиталT
, - Вы определяете
getDate
функционировать, но никогда не использовать его. - Вы никогда не выйдете из
while
цикл, так как вы неbreak
после получения ввода успешно. - Использовать "случай верблюда" для имен переменных и методов в Python считается плохим стилем.
- Вы используете слово "старше" в отношении дат, но без года вы не можете сказать, если один человек старше другого.
- Вы перехватываете любое исключение, которое выдается, когда пытаетесь проанализировать дату, но не отображаете ее и не проверяете ее тип. Это плохая идея, так как если вы неправильно набрали имя переменной (или похожую опечатку) в этой строке, вы не увидите ошибку.
Вот переписанная версия вашего кода, которая исправляет эти проблемы - я надеюсь, что из приведенного выше ясно, почему я внес эти изменения:
import datetime
def get_date(prompt):
while True:
user_input = raw_input(prompt)
try:
user_date = datetime.datetime.strptime(user_input, "%m-%d")
break
except Exception as e:
print "There was an error:", e
print "Please enter a date"
return user_date.date()
birthday = get_date("Please enter your birthday (MM-DD): ")
another_date = get_date("Please enter another date (MM-DD): ")
if birthday > another_date:
print "The birthday is after the other date"
elif birthday < another_date:
print "The birthday is before the other date"
else:
print "Both dates are the same"
Есть две основные функции, которые используются для преобразования между объектом даты и строкой: strftime
а также strptime
,
strftime используется для форматирования. Возвращает строковый объект. strptime используется для разбора. Возвращает объект datetime.
Больше информации в документации.
Поскольку вы хотите использовать объект datetime, вы можете использовать strptime. Вы можете использовать его следующим образом:
>>> datetime.datetime.strptime('01-23', '%m-%d')
datetime.datetime(1900, 1, 23, 0, 0)
Обратите внимание, что если не анализировать год, будет установлено значение по умолчанию 1900.
Ну, datetime.date.strftime требует объект datetime вместо строки.
В вашем случае лучше всего создать дату вручную:
import datetime
...
birthday1 = raw_input("Please enter your birthday (MM-DD): ")
try:
month, day = birthday1.split('-')
date1 = datetime.date(2011, int(month), int(day))
except ValueError as e:
# except clause
# the same with date2
И тогда, когда у вас есть две даты, date1 и date2, вы можете просто сделать:
if d1 < d2:
# do things to d1, it's earlier
else:
# do things to d2, it'2 not later