вычислить интервал времени в python с использованием модуля datetime [duplicate]

Не совсем очевидно, почему нужно было бы объединить (десятичные) значения «ascii». Несомненно, что объединение их без ведущих нулей (или какого-либо другого дополнения или разделителя) бесполезно - ничто не может быть надежно восстановлено из такого выхода.

>>> tests = ["hi", "Hi", "HI", '\x0A\x29\x00\x05']
>>> ["".join("%d" % ord(c) for c in s) for s in tests]
['104105', '72105', '7273', '104105']

Обратите внимание, что первые 3 выхода разной длины. Обратите внимание, что четвертый результат совпадает с первым.

>>> ["".join("%03d" % ord(c) for c in s) for s in tests]
['104105', '072105', '072073', '010041000005']
>>> [" ".join("%d" % ord(c) for c in s) for s in tests]
['104 105', '72 105', '72 73', '10 41 0 5']
>>> ["".join("%02x" % ord(c) for c in s) for s in tests]
['6869', '4869', '4849', '0a290005']
>>>

Не замечайте таких проблем.

60
задан Community 23 May 2017 в 10:31
поделиться

5 ответов

Решение находится в ссылке, которую вы предоставили в своем вопросе:

datetime.combine(date.today(), time()) + timedelta(hours=1)

Полный пример:

from datetime import date, datetime, time, timedelta

dt = datetime.combine(date.today(), time(23, 55)) + timedelta(minutes=30)
print dt.time()

Выход:

00:25:00
97
ответ дан jfs 18 August 2018 в 18:56
поделиться
  • 1
    Это немного похоже на работу, чтобы улучшить данные по неактуальной информации. Что произойдет, если today() за день до перехода на летнее время, а timedelta - в другой часовой пояс? Является ли этот код затронутым локалями? – bluenote10 4 April 2017 в 20:46
  • 2
    @ bluenote10 наивный объект datetime - это всего лишь целое число микросекунд, которое разбито в соответствии с прорептическим григорианским календарем. Другими словами, код в ответе работает так же, как и во время перехода DST в любой локальный часовой пояс. date.today() используется для поддержки как положительных, так и отрицательных timedeltas. date.min будет работать на положительные timedeltas. – jfs 5 April 2017 в 07:03
  • 3
    @ J.F.Sebastian: Это обнадеживает, спасибо за обновление. Это все еще заставляет меня съеживаться, если функция, которая должна быть чистой, имеет побочный эффект. Люди с 9999 года тоже не понравятся;). – bluenote10 5 April 2017 в 07:11
  • 4
    @ bluenote10 Практичность превосходит чистоту. Я сомневаюсь, что datetime.MAXYEAR останется 9999 в 9999 году. – jfs 5 April 2017 в 07:31

Это немного неприятно, но:

from datetime import datetime, timedelta

now = datetime.now().time()
# Just use January the first, 2000
d1 = datetime(2000, 1, 1, now.hour, now.minute, now.second)
d2 = d1 + timedelta(hours=1, minutes=23)
print d2.time()
6
ответ дан Ali Afshar 18 August 2018 в 18:56
поделиться
  • 1
    +1: для модуля datetime. В противном случае это потребует обработки ошибок переполнения и такого вручную. – jfs 18 March 2009 в 00:25

Вы можете изменить время () на теперь (), чтобы он работал

from datetime import datetime, timedelta
datetime.now() + timedelta(hours=1)
1
ответ дан duhaime 18 August 2018 в 18:56
поделиться

Если стоит добавить другой файл / зависимость в ваш проект, я только что написал маленький класс, который расширяет datetime.time с возможностью делать арифметику. Если вы пройдете за полночь, он просто обернется вокруг:

>>> from nptime import nptime
>>> from datetime import timedelta
>>> afternoon = nptime(12, 24) + timedelta(days=1, minutes=36)
>>> afternoon
nptime(13, 0)
>>> str(afternoon)
'13:00:00'

Он доступен из PyPi как nptime («не-педантичное время») или в GitHub: https: // github .com / tgs / nptime

Документация находится в http://tgs.github.io/nptime/

10
ответ дан rescdsk 18 August 2018 в 18:56
поделиться
  • 1
    Отлично. Это экономит поездку туда и обратно в мир мира и обратно. – Syncopated 27 December 2012 в 07:37

Обход проблемы:

t = time()
t2 = time(t.hour+1, t.minute, t.second, t.microsecond)

Вы также можете опустить микросекунды, если вам не нужна такая точность.

3
ответ дан sth 18 August 2018 в 18:56
поделиться
  • 1
    да, хороший ответ. Я должен был сделать это сложнее, например: time () + timedelta (minutes = 30) – Antonius Common 17 March 2009 в 23:50
  • 2
    Да, тогда это становится грязнее .. – sth 18 March 2009 в 00:09
  • 3
    s /. t.second /, t.second / – jfs 18 March 2009 в 00:17
  • 4
    Если t == time(23,59), то этот подход не будет работать. Когда вы добавите 1 в t.hour, вы получите ValueError: hour must be in 0..23 – jfs 18 March 2009 в 00:20
  • 5
Другие вопросы по тегам:

Похожие вопросы: