Вычтите время из поля даты и времени в Django / Python

#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() . Также вы должны вставить вывод, который вы генерируете, и ошибку, о которой идет речь, иначе другие не смогут отлаживать, потому что ваши испытания только с вами