문제

sqlalchemy 's DateTime 유형을 허용합니다 timezone=True 데이터베이스에 Nonive DateTime 객체를 저장하고이를 반환하는 인수. 시간대를 수정하는 방법이 있습니까? tzinfo 그 sqlalchemy는 예를 들어 UTC 일 수 있도록 통과합니까? 나는 그냥 사용할 수 있다는 것을 알고 있습니다 default=datetime.datetime.utcnow; 그러나 이것은 내가 사용하더라도 순진한 로컬 타임 기반 DateTeM을 통과하는 사람을 행복하게 받아들이는 순진한 시간입니다. timezone=True 그것으로, 그것은 현지 또는 UTC 시간을 기본 시간대없이 정상화 할 수 없게 만들기 때문에. 나는 시도했다 pytz)) DateTime 객체를 상대적으로 만들기 위해서는 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) # 내 현지 타임 오프셋입니다 !!

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

...

True # 이번에는 DB에 시간대를 저장하지 않았습니다.

도움이 되었습니까?

해결책

http://www.postgresql.org/docs/8.3/interactive/datatype-datetime.html#datatype-timezones

모든 시간대 인식 날짜와 시간은 UTC에 내부적으로 저장됩니다. 클라이언트에 표시되기 전에 TimeZone 구성 매개 변수에 의해 지정된 영역에서 현지 시간으로 변환됩니다.

PostgreSQL과 함께 저장하는 유일한 방법은 별도로 저장하는 것입니다.

다른 팁

해결책이 제공됩니다 이 질문은 대답:

UTC의 데이터베이스에 모든 (날짜) 시간 객체를 저장하고 결과 순진한 DateTime 객체를 검색시 인식으로 변환하여 우회 할 수 있습니다.

유일한 단점은 시간대 정보를 잃어버린 것이지만 어쨌든 DateTime 객체를 UTC에 저장하는 것이 좋습니다.

시간대 정보에 관심이있는 경우 별도로 저장하고 마지막으로 가능한 인스턴스에서 UTC를 현지 시간으로 만 변환합니다 (예 : 표시 직전).

또는 결국 관리 할 필요가 없으며 Progam을 실행하는 컴퓨터에서 로컬 타임 존 정보를 사용할 수 있습니다. 또는 WebApp 인 경우 사용자의 브라우저.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top