2015-09-09 3 views
-3

Я пытаюсь получить текущее время и сравнить его с датой, взятой из строки. Это код, у меня есть:Получить текущую дату/время и сравнить с другой датой

import datetime 

CurrentDate = str(datetime.datetime.now()) 
CurrentDate = datetime.strptime(CurrentDate, "%d/%m/%Y %H:%M") 
print(CurrentDate) 

ExpectedDate = "9/8/2015 4:00" 
ExpectedDate = datetime.datetime.strptime(ExpectedDate, "%d/%m/%Y %H:%M") 
print(ExpectedDate) 

if CurrentDate > ExpectedDate: 
    print("Date missed") 
else: 
    print("Date not missed") 

Но это ошибка я получаю.

CurrentDate = datetime.strptime(CurrentDate, "%d/%m/%Y %H:%M") AttributeError: 'module' object has no attribute 'strptime'

+1

Один вопрос по почте, не сравнить даты как строки, и, пожалуйста, попробуйте некоторые основные отладки, прежде чем задать вопрос. Чтение строки ошибок должно сделать очевидным, что вы вызываете «strptime» неправильно, что должно быть исправлено путем быстрой поездки в документы. –

+0

related: [Найти, если прошло 24 часа между датами - Python] (http://stackoverflow.com/q/26313520/4279) – jfs

ответ

3

Там нет особого смысла в преобразовании datetime.datetime.now() в строку, просто так что вы можете преобразовать его обратно в DateTime. Просто оставьте это как есть.

import datetime 

CurrentDate = datetime.datetime.now() 
print(CurrentDate) 

ExpectedDate = "9/8/2015 4:00" 
ExpectedDate = datetime.datetime.strptime(ExpectedDate, "%d/%m/%Y %H:%M") 
print(ExpectedDate) 

if CurrentDate > ExpectedDate: 
    print("Date missed") 
else: 
    print("Date not missed") 

Результат:

2015-09-09 12:25:00.983745 
2015-08-09 04:00:00 
Date missed 
+0

может произойти сбой при переходе DST. Вы должны использовать объекты времени и времени, соответствующие времени и времени. Здесь [возможные решения] (http://stackoverflow.com/a/26313848/4279) – jfs

3

Внутри модуля даты и времени, класс называется DateTime как хорошо, который вы, вероятно, знаете, так как вы сделали это прямо в остальной части кода.

Ваша третья линия должна быть:

CurrentDate = datetime.datetime.strptime(CurrentDate, "%d/%m/%Y %H:%M") 

И InstEd двух datetime s есть только один. Эта строка вызывает ошибку. Кроме того, вы можете просто импортировать весь класс:

from datetime import datetime 

И не будет никакой необходимости указывать datetime два раза, что является немного легче.

Редактировать: Как указал двухбитовый алхимик (что я, честно говоря, не заметил), вы сравниваете даты со строкой, которая не будет работать хорошая практика. Взгляните на различные фрагменты в категории this question. Сравнение цен на Python с ценами не доступно.

+1

«Вы сравниваете даты по строке, которая не будет работать». Можете ли вы объяснить это немного дальше? Почему вы не можете сравнить две даты, которые вы извлекли из строк, используя 'strptime'? Кроме того, есть ли у вас какие-либо комментарии к ошибке 'ValueError: time data '2015-09-09 11: 47: 34.298745' не соответствует формату '% d /% m /% Y% H:% M'', которое возникает, когда вы изменяете исходный код с предлагаемым изменением? – Kevin

+0

Мой Python немного ржавый. По-видимому, это действительно работает, но, на мой взгляд, лучше сравнивать даты Date, а не даты-как-строки. Google, я ошибаюсь. Я отредактировал свой ответ, чтобы отразить то, что вы указали. И о вашем втором вопросе, вы должны попробовать переключить% d и% m. Я думаю, что они находятся в другом порядке :) – Mirza

+0

Переключение «d» и «m» по-прежнему дает ValueError. Я почти уверен, что это потому, что часть секунд «секунд» не обрабатывается. – Kevin

0

Я узнал эту прекрасную module, которые делают манипуляции с датой так просто:

import arrow 

n = arrow.utcnow() 
expected = arrow.get("9/8/2015 4:00", "D/M/YYYY H:m") 

if n > expected: 
    print("Date Missed.") 
else: 
    print("Date not missed.") 
+0

примечание: 'arrow' предполагает, что здесь вводится время UTC (это хорошо). Но OP использует 'datetime.now()', что подразумевает, что вход может быть в локальное время (это может отличаться от UTC). – jfs

+0

вы правы, но, похоже, вы можете сделать: arrow.get (datetime.now()) :) –

+0

также неверно. Он интерпретирует объект наивного datetime ввода как время в UTC, которое неверно ('datetime.now()' представляет локальное время). Даже если объекты «Arrow» используются только для сравнения; он может выйти из строя для любого локального часового пояса с нефиксированным смещением utc (большинство из них). – jfs

Смежные вопросы