#python #django #datetime #django-models
#python #django #дата и время #django-модели
Вопрос:
Этот вопрос кажется очевидным и простым, но я здесь напрягаю голову. Проблема в том, что у меня есть поле datetime в модели, и я хочу вычесть время из другого атрибута. вот мой код, который я пробовал до сих пор.
@property
def boarding_time(self):
print('---------------------------')
time = self.schedule.travel_date_time.time()
print()
time_added = self.schedule.bus_company_route.routeboardingpoint_set.get(
point=self.boarding_point
).time_added
time1 = timedelta(hours=time.hour, minutes=time.minute, seconds=time.second)
time2 = timedelta(hours=time_added.hour, minutes=time_added.minute, seconds=time_added.second)
return (time1-time2)
На самом деле я пытаюсь определить время задержки, с которой транспортное средство достигает определенного пункта назначения. Предположим, что транспортное средство должно было двигаться в 8 часов утра, но транспортное средство покинуло автобусный парк в 8:15 утра, и к их местоположению будет добавлено 15 минут ожидания пассажиров, но я получаю сообщение об ошибке как
'datetime.timedelta' object has no attribute 'isoformat'
Комментарии:
1. вы пытаетесь вычесть один timedelta (
time2
) из другого (time1
) — вот почему возникает ошибка. Но из вопроса не ясно, зачем вы это делаете. Предполагается, что Timedeltas добавляет или вычитает из объектов datetime. Так что вычтитеtime2
прямо изtime
.2. На самом деле я пытаюсь определить время задержки, с которой транспортное средство достигает определенного пункта назначения. Предположим, транспортное средство должно было тронуться в 8 утра, но транспортное средство отбыло в 8:15 утра, и таким образом к вашему местоположению будет добавлено 15 минут ожидания пассажира.
3. затем вы можете попытаться объединить ответ @edward-lu с моим комментарием. Предполагается
time
, что это объект datetime иtime_added
как объект времени (всегда ли он в один и тот же день?), Вы можете взять часть датыtime
, затем объединить ее сtime_added
, затем вычестьtime
из результата, чтобы получить timedelta:delta = datetime.combine(time.date(), time_added) - time
. Это может сработать, но это не сработает, еслиtime_added
произойдет в другой день. Еслиtime_added
это тоже datetime, это становится намного проще — просто вычтитеtime
изtime_added
:delta = time_added - time
.4. я попробовал ваш подход, поскольку он был в тот же день,
return datetime.combine(self.schedule.travel_date_time.date(), time) - datetime.combine(self.schedule.travel_date_time.date(), time_added)
но ошибка такая же
Ответ №1:
Я не уверен, отвечает ли это на ваш вопрос, но вы можете попробовать:
from datetime import datetime, date
datetime.combine(date.today(), exit) - datetime.combine(date.today(), enter)
объединение создает дату и время, которые можно вычесть. Вы можете узнать об этом в Google подробнее…
https://docs.python.org/3/library/datetime.html
Комментарии:
1. на самом деле любая дата может быть вычтена. Combine предназначен для создания даты и времени из отдельных объектов даты и времени.
2. получил ту же ошибку, что и я, попробовав это
return datetime.combine(self.schedule.travel_date_time.date(), time) - datetime.combine(self.schedule.travel_date_time.date(), time_added)
Ответ №2:
На высоком уровне скорректированное время посадки получается из запланированного времени посадки и добавления к нему количества времени, прошедшего между запланированным временем отправления и фактическим временем отправления из предыдущего пункта назначения.
Вот упрощенный пример, который, как мы надеемся, иллюстрирует ключевые концепции, которые помогут вам собрать воедино решение вашей более сложной проблемы:
from datetime import datetime, timedelta
scheduled_boarding_time = datetime.fromisoformat("2021-01-12T10:00")
departure_delay_in_minutes = 15
adjusted_boarding_time = scheduled_boarding_time timedelta(minutes=delay_in_minutes)
print(adjusted_boarding_time.isoformat())
2021-01-12T10:15:00
Ответ №3:
Решение вашего вопроса заключается в том, как вы обрабатываете формат метки времени. AM/PM
Для этого вам нужно соответствующим образом отформатировать дату. Вот что вы можете сделать вместо того, что вы делаете прямо сейчас
from datetime import datetime
time = '2021/1/13 8:15 am' #your date format
time_added = '2021/1/13 8:45 am' #your date format
format = '%Y/%m/%d %H:%M %p' #will format your date for further computation
time = datetime.strptime(time, format)
time
o/p
datetime.datetime(2021, 1, 13, 8, 15)
time_added = datetime.strptime(time_added, format)
time_added
o/p
datetime.datetime(2021, 1, 13, 8, 45)
time2 = time_added-time1 # this will give you time difference in seconds
divmod(time2.total_seconds(), 60)[0] #use this to get difference in minutes
o/p
30.0
Это же самое вы возвращаете в своей функции, и это решит вашу проблему
Комментарии:
1. у меня есть только время
time2
не на всю дату, так как оно относится к той же дате2. итак, вы хотите, чтобы несколько часов или минут добавлялись сами по
time1
себе? пример:8am 30 mins = 8.30
я вхожуtime2
и указываю формат, в которомtime_added
будет3. и, предположительно, добавленная дата также будет самой меткой времени, поэтому она должна работать
4.
strptime() argument 1 must be str, not datetime.datetime
получил это5.
strptime()
требуется, когда вы передаете строку столько времени, сколько вы видите в моем ответе, ошибка, которую вы получаете, потому что у вас уже есть формат datetime, и вы можете напрямую применитьformat()
вместоstrptime()
. Также вы должны вставить вывод, который вы генерируете, и ошибку, о которой идет речь, иначе другие не смогут отлаживать, потому что ваши испытания только с вами