سؤال

ونوع DateTime SQLAlchemy يسمح للحجة timezone=True لحفظ الكائن التاريخ والوقت غير ساذج إلى قاعدة البيانات، والعودة على هذا النحو. هل هناك أي طريقة لتعديل التوقيت لtzinfo الذي يمر SQLAlchemy في ما يمكن أن يكون، على سبيل المثال، التوقيت العالمي؟ وأنا أدرك أن أتمكن من مجرد استخدام default=datetime.datetime.utcnow. ومع ذلك، فإن هذا هو الوقت السذاجة أن سيقبل بسعادة شخص يمر في التاريخ والوقت على أساس LOCALTIME السذاجة، حتى لو كنت timezone=True معها، لأنه يجعل بالتوقيت المحلي أو UTC غير ساذجة دون وجود قاعدة التوقيت لتطبيع معها. لقد حاولت (باستخدام pytz ) لجعل الكائن التاريخ والوقت غير ساذجة، ولكن عندما حفظ هذا ل DB يتعلق الأمر يعود إلى السذاجة.

لاحظ كيف datetime.datetime.utcnow لا يعمل مع timezone=True على ما يرام:

import sqlalchemy as sa
from sqlalchemy.sql import select
import datetime

metadata = sa.MetaData('postgres://user:pass@machine/db')

data_table = sa.Table('data', metadata,
    sa.Column('id',   sa.types.Integer, primary_key=True),
    sa.Column('date', sa.types.DateTime(timezone=True), default=datetime.datetime.utcnow)
)

metadata.create_all()

engine = metadata.bind
conn = engine.connect()
result = conn.execute(data_table.insert().values(id=1))

s = select([data_table])
result = conn.execute(s)
row = result.fetchone()
<اقتباس فقرة>   

و(1، datetime.datetime (2009، 1، 6، 0، 9، 36، 891887))

row[1].utcoffset()
<اقتباس فقرة>   

وdatetime.timedelta (-1، 64800) # هذا هو بلدي LOCALTIME تعويض !!

datetime.datetime.now(tz=pytz.timezone("US/Central"))
<اقتباس فقرة>   

وdatetime.timedelta (-1، 64800)

datetime.datetime.now(tz=pytz.timezone("UTC"))
<اقتباس فقرة>   

وdatetime.timedelta (0) #UTC

وحتى لو كنت تغييره إلى استخدام صراحة UTC:

...

data_table = sa.Table('data', metadata,
    sa.Column('id',   sa.types.Integer, primary_key=True),
    sa.Column('date', sa.types.DateTime(timezone=True), default=datetime.datetime.now(tz=pytz.timezone('UTC')))
)

row[1].utcoffset()

...

<اقتباس فقرة>   

وdatetime.timedelta (-1، 64800) # انها لم تستخدم التوقيت أضفت صراحة

وأو إن إسقاط timezone=True:

...

data_table = sa.Table('data', metadata,
    sa.Column('id',   sa.types.Integer, primary_key=True),
    sa.Column('date', sa.types.DateTime(), default=datetime.datetime.now(tz=pytz.timezone('UTC')))
)

row[1].utcoffset() is None

...

<اقتباس فقرة>   

وصحيح # أنه لا حتى حفظ التوقيت لديسيبل هذه المرة

هل كانت مفيدة؟

المحلول

http://www.postgresql.org/ مستندات / 8.3 / التفاعلية / نوع البيانات-datetime.html # نوع البيانات-الزمنية

<اقتباس فقرة>   

ويتم تخزين كافة التواريخ والأوقات-التوقيت علم داخليا في UTC. يتم تحويلها إلى التوقيت المحلي في المنطقة المحددة من قبل معلمة تكوين التوقيت قبل عرضه على العميل.

والطريقة الوحيدة لتخزينه مع كيو لتخزين بشكل منفصل.

نصائح أخرى

ويتم إعطاء الحل في الجواب هذا السؤال في:

ويمكنك التفاف حول ذلك عن طريق تخزين جميع (التاريخ) كائنات الوقت في قاعدة البيانات الخاصة بك في UTC، وتحويل الناتج الكائنات التاريخ والوقت ساذجة لتلك التي تدرك على استرجاعها.

ولكن العائق الوحيد هو أن تفقد المعلومات الزمنية، ولكن من المحتمل ان يكون فكرة جيدة لتخزين الأشياء الخاصة بك التاريخ والوقت في UTC، على أي حال.

وإذا كنت تهتم بالمعلومات التوقيت، فما استقاموا لكم فاستقيموا تخزينه على حدة، وفقط تحويل بالتوقيت العالمي إلى التوقيت المحلي في المقام اخر لحظة ممكنة (على سبيل المثال الحق قبل عرض)

وأو ربما لا تحتاج إلى رعاية بعد كل شيء، ويمكن استخدام المعلومات التوقيت المحلي من الجهاز تشغيل برنامج تثبيت إليكترونى الخاص بك، أو متصفح المستخدم لو كان تطبيق الويب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top