#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)