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
Другие вопросы по тегам