Python: сравнение дат и распечатка первой

1

Это, вероятно, очень просто, но я начинающий в python, и мне хотелось сравнить даты рождения, предлагая пользователю ввести дату в формате MM-DD. Нет года, потому что год в текущем году (2011). Затем он предложит пользователю ввести другую дату, а затем программа сравнивает ее, чтобы увидеть, какой из них является первым. Затем он печатает более ранний день и это название дня недели.

Пример: 02-10 - раньше 03-11. 02-10 находится в четверг и 03-11 находится в пятницу

Я только что начал изучать модули, и я знаю, что я должен использовать модуль datetime, класс даты и 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"  
  • 1
    У вас есть некоторые проблемы с отступами, это очевидно. И почему вы использовали try только один раз? Ты читаешь две даты. Я не очень понимаю ваши шаги. Сначала вы должны прочитать хороший учебник по Python. docs.python.org/tutorial/index.html
Теги:
datetime
date
strftime

3 ответа

4

В коде, который вы опубликовали, есть несколько проблем. Я надеюсь, что будет полезно указать некоторые из них и предоставить несколько переписанную версию:

  • Отступ сломан, но я предполагаю, что это могут быть проблемы с вставкой в ​​Stack Overflow
  • 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"
  • 0
    Большое спасибо! Да, это определенно более ясно, чем раньше из того, что я имел. Я использую вступление к книге на Python, в которой нет подробностей о том, что делают модули / объекты и когда / как их использовать. Я думаю, пришло время для нового и лучшего, ха-ха.
1

Существуют две основные функции, которые используются для преобразования между объектом даты и строкой: strftime и strptime.

strftime используется для форматирования. Он возвращает строковый объект. strptime используется для разбора. Он возвращает объект datetime.

Дополнительная информация в документах.

Поскольку вам нужен объект datetime, вы бы хотели использовать strptime. Вы можете использовать его следующим образом:


>>> datetime.datetime.strptime('01-23', '%m-%d')
datetime.datetime(1900, 1, 23, 0, 0)

Обратите внимание, что при отсутствии синтаксического анализа по умолчанию значение по умолчанию будет равным 1900.

1

Ну, 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

И тогда, когда у вас есть две даты, дата1 и дата2, вы можете просто сделать:

if d1 < d2:
  # do things to d1, it earlier
else:
  # do things to d2, it'2 not later
  • 0
    Должно быть except ValueError .
  • 0
    Да, спасибо, это исправят. Хороший стиль - это всегда хороший стиль, даже в примерах. Еще раз спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню