Как создать объект datetime из дня и времени и обработать необходимый часовой пояс?

#python #postgresql #datetime #flask #flask-sqlalchemy

Вопрос:

Я создал форму с полем даты и полем времени. При печати их с маршрутов.py Я получаю эти примерные значения:

 TimeField: 17:30:00
DateField: 2021-07-12
 

Как я могу превратить эти значения в объект datetime, который я могу отправить в свою базу данных Postgres? Требуемый формат объекта-дата-время. Таблица Postgres настроена как TIMESTAMPTZ. Я попытался заменить (), чтобы добавить время в данные поля даты. Но это не работает. Я новичок во времени и тому подобном, поэтому, пожалуйста, простите мое невежество. Как работают часовые пояса? потому что мне, вероятно, нужно как-то добавить часовой пояс для временной МЕТКИ, верно?

Ниже приведен минимальный код для функционирования

forms.py

 class CreateEvent(Form):
    dt = DateField('DateTimePicker')
    start_time = TimeField('Start')
    submit = SubmitField("Submit") 
models.py

class Events(db.Model):
    __tablename__='events'
    eid = db.Column(db.Integer, primary_key = True)
    event_day = db.Column(db.DateTime, nullable=False)
    start_time = db.Column(db.DateTime, nullable=False)
    
    def __init__(self, event_day, start_time):
        self.event_day = event_day
        self.start_time = start_time
 

routes.py

 if request.method == 'POST':
    if form.validate() == False:
        return render_template('create.html', form=form)
    else:
        event_day = form.dt.data
        start_time = form.start_time.data
        print(start_time)
        print(event_day)
        start_time = event_day.replace(time=start_time)
        newevent = Events(event_day, start_time)
        db.session.add(newevent)
        db.session.commit()
        return "Success"
 

На всякий случай, вот инструкция Postgres Create для таблицы:

 CREATE TABLE events (
    eid serial PRIMARY KEY NOT NULL,
    event_day TIMESTAMPTZ NOT NULL,
    start_time TIMESTAMPTZ NOT NULL,
);
 

Комментарии:

1. вы можете сделать это отметкой времени, используя это "{} {}".format(DateField, TimeField) . а затем подтолкни его к своему столу

Ответ №1:

установка pip dateutil :

https://dateutil.readthedocs.io/en/stable/

затем:

 from dateutil.parser import parse

TimeField = "17:30:00"
DateField = "2021-07-12"

parse(DateField   ' '   TimeField)

datetime.datetime(2021, 7, 12, 17, 30)

 

Вам, вероятно, не нужно добавлять часовой пояс, Postgres будет использовать timezone настройки для сервера. Postgres на самом деле не хранит часовой пояс в поле timestamptz. Он просто использует timezone настройку для поворота значения на время UTC для хранения.

Ответ №2:

Не тестировался, но в качестве примера, и вам, возможно, придется установить pytz из PIP (если он еще не присутствует в вашей системе). Python знает так называемые наивные объекты datetime (которые не имеют контекста часового пояса) и объекты datetime с учетом часовых поясов.

Таким образом, цель состоит в том, чтобы построить строку с датой и временем, а затем проанализировать ее в объект datetime. Затем мы добавляем желаемый часовой пояс (в данном примере предполагается, что США/Тихий океан, поэтому изменяйте его по мере необходимости).

 import datetime
import pytz

TimeField = "17:30:00"
DateField = "2021-07-12"

current_tz = pytz.timezone('US/Pacific')

# parse string into naive datetime object
dt_naive = datetime.datetime.strptime(f"{DateField} {TimeField}", "%Y-%m-%d %H:%M:%S")

# convert to time zone-aware datetime
dt_aware = current_tz.localize(dt_naive)