2015-05-29 4 views
1

Мне нужно сэкономить время в AMPM формате.Сравнение времени Python в полночь

Но у меня возникли проблемы при принятии решения о том, как войти в полночное время.

Предположим, что настало время 9 вечера до 6 утра. Я должен разделить его изо дня в день. Как это

t1 = datetime.datetime.strptime('09:00PM', '%I:%M%p').time() 

t2 = datetime.datetime.strptime('12:00AM', '%I:%M%p').time() 

t3 = datetime.datetime.strptime('06:00AM', '%I:%M%p').time() 

Теперь я хочу знать, должен ли быть t2

12:00 AM или 11.59PM

Если я до 12:00 утра, то я не могу сравнить, если 9pm > 12am но 11,59 выглядит странно или может будь то правильный путь

+0

Насколько я знаю, день с 12 до 11.59 вечера – Maresh

+0

, так что его нормально иметь 11.59, я не знаю, как 59 фигура кажется неудобной. Buf, если это то, что люди используют, тогда все в порядке со мной – user3214546

+0

Это либо то, либо использовать дату (день) для сравнения, а также –

ответ

4

Вы должны всегда использовать 00:00 (или 12:00 AM) для представления полночь.

Использование 23:59 (или 11:59 PM) проблематично по нескольким причинам:

  • Высокоточные вопросы в сравнении. Есть 23:59:01 не до полуночи? Как насчет 23:59:59.9999?

  • Расчет продолжительности будет сброшен с любой точностью, которую вы выбрали. Считайте, что 10:00 pm до полуночи составляет 2 часа, а не 1 час и 59 минут.

Чтобы избежать этих проблем, вы всегда должны обрабатывать интервалы времени как полуоткрытые интервалы. То есть, диапазон имеет инклюзивный старт и эксклюзивный конец. В interval notation: [start, end)

Теперь в отношении пересечения границы полночь:

  • Когда вы сравниваете раз, связанные с датой, вы можете просто сравнить непосредственно:

    [2015-01-01T21:00, 2015-01-02T06:00) = 9 hours 
    2015-01-01T21:00 < 2015-01-02T06:00 
    
  • Когда у вас нет даты, вы можете определить продолжительность, но вы не можете определить порядок!

    [21:00, 06:00) = 9 hours 
    21:00 < 06:00 OR 21:00 > 06:00 
    

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

    Both 23:00 and 01:00 are in the range [21:00, 06:00) 
    21:00 is also in that range, but 06:00 is NOT. 
    

    Подумайте о часах. Он моделируется как круг, а не как прямая линия.

  • Для расчета продолжительности времени только интервал, который может пересечь полночь, используйте следующий псевдокод:

    if (start <= end) 
        duration = end - start 
    else 
        duration = end - start + 24_hours 
    

    Или более просто:

    duration = (end - start + 24_hours) % 24_hours 
    
  • Чтобы определить, является ли время только значение относится к интервалу времени, который может пересекать полночь, использовать этот псевдокод:

    if (start <= end) 
        is_between = start <= value AND end > value 
    else 
        is_between = start <= value OR end > value 
    

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

Кроме того, большая часть этого документа покрыта моим курсом Date and Time Fundamentals на Pluralsight (ближе к самому концу, в разделе «Работа с диапазонами»).

+1

О полуоткрытых диапазонах и почему полночь должна быть равна нулю: [E.W. Дейкстра: нумерация должна начинаться с нуля] (https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html). Вот [реализация в Python функции 'time_diff()', которая находит продолжительность] (http://stackoverflow.com/a/28607501/4279), и вот ['in_between()' function] (http: // stackoverflow. ком/а/28553237/4279) – jfs

0

Как насчет получения t1 = 09:00PM, t2 = 11.59PM, t3 = 12:00AM и t4 = 06:00AM. Тогда у вас есть определенные интервалы времени в день. Конечно, добавление даты также создало бы различия во времени.

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