Python - преобразовать наивное время и дату в UTC

У меня есть дата, которую я получаю в определенном часовом поясе, но система обрабатывает ее как UTC, а позже преобразует ее обратно в этот часовой пояс, путая время.

Например вот так:

Я получаю на этот раз: 2014-05-05 10:50:30. его объект даты и времени. У него нет информации о часовом поясе, но я могу получить информацию о часовом поясе от пользователя, который использует это время. Дело в том, что это время отображается как время «Европа/Вильнюс», но система обрабатывает его как UTC, и когда она выводит время пользователю, она добавляет +3 часа, показывая неправильное время. Неважно, если я изменю часовой пояс на часовой пояс пользователя для этого объекта datetime, он все равно выводит с +3 часами.

Например (фрагмент кода):

from datetime import datetime
import pytz         
create_date = datetime.strptime(stage_log.create_date, "%Y-%m-%d %H:%M:%S")
tz = pytz.timezone(self.user_id.tz)
create_date = create_date.replace(tzinfo=pytz.utc)

Это ничего не делает, и я все еще получаю неправильное время.

Есть ли способ переместить время, чтобы оно было правильным временем UTC (чтобы система правильно преобразовала часовой пояс пользователей), например:

2014-05-05 10:50:30 -> конвертировать в UTC. Если часовой пояс «Европа/Вильнюс», он должен преобразовать это время в 2014-05-05 07:50:30. Затем, когда система автоматически выполняет преобразования, она будет правильно отображать 2014-05-05 10:50:30, потому что это время, которое она должна отображать.

Кроме того, если есть способ просто получить количество часов, в течение которых данный часовой пояс отличается от UTC, то я мог бы сделать это так же просто:

create_date.replace(hour=create_date.hour-timezone_difference)


person Andrius    schedule 09.08.2014    source источник
comment
Это спасло положение - stackoverflow.com/questions/79797/   -  person Andrius    schedule 09.08.2014


Ответы (1)


Хотя этот вопрос конкретно не относится к odoo, мы надеемся, что следующее может помочь другим:

Odoo — конвертировать дату и время в UTC: (примечание: в этом примере self.start_date — это fields.Date)

start_date = fields.Datetime.to_string(pytz.timezone(self.env.context['tz']).localize(fields.Datetime.from_string(self.start_date), is_dst=None).astimezone(pytz.utc))

аналогично, но с +24 часами

end_date = fields.Datetime.to_string(pytz.timezone(self.env.context['tz']).localize(fields.Datetime.from_string(self.end_date), is_dst=None).astimezone(pytz.utc) + timedelta(hours=24))

Это использовалось, потому что переданные значения (self.start_date) были field.Date и поэтому не подвергались влиянию часовых поясов, в то время как целевые сохраненные поля были fields.Datetime и поэтому хранились в UTC.

start_date/end_date, которые теперь указаны в формате UTC, затем можно использовать в self.env[''].search([])

person Palza    schedule 07.11.2016