2016-04-15 3 views
2

Учитывая строку в формате strftime('%b %d, %Y %I:%M %p') например datetime: 'Apr 17, 2016 02:00 AM'сравнение datetime со строкой?

есть способ проверить, если это время уже прошло? как можно сравнить

datetime.datetime.now().strftime('%b %d, %Y %I:%M %p') 

как-то струны 'Apr 17, 2016 02:00 AM'

ответ

7

Обработать строку в datetime.datetime экземпляра затем сравните datetime.now():

from datetime import datetime 

dt = datetime.strptime('Apr 17, 2016 02:00 AM', '%b %d, %Y %I:%M %p') 
if dt < datetime.now(): 
    print('{} alread past'.format(dt)) 

Вы могли бы сделать, что функции:

def is_past(dt_string): 
    return datetime.strptime(dt_string, '%b %d, %Y %I:%M %p') < datetime.now() 

А потом называют это так:

>>> is_past('Apr 17, 2016 02:00 AM') 
False 
>>> is_past('Apr 01, 2016 02:00 AM') 
True 
5

Нет, сравнение строк не будет работать здесь; значения не сортируются в соответствии с полной датой, но в соответствии с месяцем и днем ​​месяца, в течение первых 10 дней месяца, которые постепенно разбросаны по всему виду, поскольку число дней не равно нулю. Если сначала был указан год, за которым следует нулевой заполненный числовой месяц, день, часы (с использованием 24-часовых часов) и минут, , то вы могли бы сделать это только как строки, потому что тогда лексикографическая сортировка будет соответствовать пути дата и время будут отсортированы.

Вместо разбора вашу строку в datetime объекта с помощью datetime.datetime.strptime() class method:

dt = datetime.datetime.strptime(string, '%b %d, %Y %I:%M %p') 
if dt < datetime.datetime.now(): 
    # in the past. 

Demo:

>>> import datetime 
>>> string = 'Apr 17, 2016 02:00 AM' 
>>> dt = datetime.datetime.strptime(string, '%b %d, %Y %I:%M %p') 
>>> dt 
datetime.datetime(2016, 4, 17, 2, 0) 
>>> dt < datetime.datetime.now() 
False 

Если вы форматировать даты, используя ISO8601 combined date-time format, то вы бы иметь формат, который может быть отсортирован только как строки:

>>> datetime.datetime.now().isoformat() 
'2016-04-15T09:55:09.907130' 
Смежные вопросы