Доступ к значениям datetime.now() в Python

Я хочу иметь возможность реализовать в своей программе условие, при котором она будет работать только в течение N часов, возможно, пользователь может указать N, но не будем забегать вперед.

Я подумал, что могу использовать datetime.now() и сохранить значение ниже в переменной, time

>>> time 
>>> time = datetime.datetime(2013, 12, 9, 21, 50, 32, 405329)

Любые идеи о том, как я могу получить доступ к четвертому полю между (--), поскольку это строка?

Мое условие было бы чем-то вроде while time != timeEnd, где timeEnd было бы значением ниже:

>>> timeEnd = datetime.datetime(2013, 12, 9, 21+N, 50, 32, 405329)

Спасибо


person codaamok    schedule 09.12.2013    source источник
comment
О чем -- ты говоришь?   -  person abarnert    schedule 10.12.2013
comment
Вы педантичны?   -  person codaamok    schedule 10.12.2013
comment
Вы не хотите выполнять математику даты/времени, исследуя только поле часа - вы можете легко завершить в (3 часа + 1 минута) или (5 часов - 1 минута), или, если некоторые задачи очень долго выполняются, могли бы даже пролет дней по ошибке. Используйте временную дельту, как предлагают ответы ниже.   -  person Chris Johnson    schedule 10.12.2013
comment
@adampski: Нет, я вообще не понимаю, о чем ты говоришь. Либо вы где-то спрашиваете о буквальном --, и в этом случае такой вещи нет, либо вы используете его в качестве заполнителя для строки, которая существует где-то в вашем примере, и в этом случае все еще нет такого; никаких строк нигде не видно.   -  person abarnert    schedule 10.12.2013
comment
@abarnet OK хорошо (--) относится к свойствам объекта datetime. Просто не верилось выписывать их все, это была краткая запись всех значений.   -  person codaamok    schedule 10.12.2013


Ответы (4)


Вы можете добавить timedelta к datetime, чтобы получить новый datetime.

>>> import datetime
>>> now = datetime.datetime.now()
>>> end_time = now + datetime.timedelta(hours=6)
>>> print now
2013-12-09 17:03:06.979628
>>> print end_time
2013-12-09 23:03:06.979628
>>> 

Потом...

while datetime.datetime.now() < end_time:
    pass # do work
person FogleBird    schedule 09.12.2013
comment
datetime.now() < end_time может не дать вам 6 часов. Это может произойти на час раньше/позже (из-за перехода на летнее время) или на любое другое время, если часы компьютера были настроены вручную. Или если компьютер был приостановлен на некоторое время; вы можете не захотеть, чтобы все события происходили одновременно, когда вы открываете обложку ноутбука. Таких проблем можно избежать - person jfs; 12.12.2013

Не используйте неосведомленные локальные объекты даты и времени, такие как возвращаемые now(), если только вы не хотите показывать их локальному пользователю. Есть много опасностей.

Существует различие между "Который час?" и "Сколько секунд прошло?". Первое узнать легче.

Чтобы пробежать N часа, вы можете:

from time import monotonic as timer # or time.time if it is not available

endtime = timer() + N * 3600
while timer() < endtime:
    # do your thing (mind what clocks use sleep(), join(), lock.acquire())

Это работает, даже если время компьютера изменилось во время выполнения программы вручную или из-за перехода на летнее время. См. раздел Rational из pep-418, чтобы познакомиться с time.monotonic в Python.

Вы можете выбрать другие таймеры в зависимости от ваших потребностей/доступных систем. Например, вы можете использовать таймер, который обеспечивает более высокую точность, но может переполниться раньше, или который принимает во внимание NTP-приложения, которые могут обеспечить лучшие часы, чем ваш локальный ЦП или время, пока система находилась в спящем или приостановленном состоянии (представьте, что вы хотите, чтобы произошло после того, как вы откроете крышку блокнота через несколько часов ).

datetime.now() объект (наивное разбитое время) может быть полезен, если вы хотите, чтобы что-то произошло в какое-то местное время, независимо от того, сколько секунд прошло с этого момента, например, чтобы сделать что-то после 7pm любого дня (до полуночи):

from datetime import datetime, time

if datetime.now().time() > time(19):
   # do something
person jfs    schedule 11.12.2013

>>> from datetime import datetime
>>> d = datetime.now()
>>> d
datetime.datetime(2013, 12, 9, 23, 0, 20, 669780)
>>> d.hour
23

Если вы хотите проверить, работает ли скрипт в течение N часов, я бы посоветовал проверить значение (now() - start_time).total_seconds(). Он скажет вам, сколько секунд работает скрипт.

Точно так же вы можете установить timeEnd так timeEnd = time + timedelta(hours=N).

person Maciej Gol    schedule 09.12.2013

Я хочу иметь возможность реализовать в своей программе условие, при котором она будет работать только в течение N часов, возможно, пользователь может указать N, но не будем забегать вперед.

Любые идеи о том, как я могу получить доступ к четвертому полю между (--), поскольку это строка?

Я не вижу ни -- в вашем коде, ни строк. У вас есть объект datetime, и у него есть член hour. Тем не менее, я не могу себе представить, как вы могли бы использовать такую ​​​​вещь в своем коде.

Просто вычтите два объекта datetime, и вы получите объект timedelta. И вы можете сравнить этот timedelta объект с другим. Например:

>>> start_time = datetime.datetime.now()

# 2 hours later

>>> end_time = datetime.datetime.now()
>>> duration = end_time - start_time
>>> duration > datetime.timedelta(hours=5)
False

# another 4 hours

>>> datetime.datetime.now() - start_time > datetime.timedelta(hours=5)
True
person abarnert    schedule 09.12.2013
comment
Не понял, что это объект. Извиняюсь! Спасибо. - person codaamok; 10.12.2013