문제 설명
PostgreSQL DB의 타임스탬프를 사용자 시간대 시간으로 어떻게 변환합니까? (How do I convert the time stamps from a PostgreSQL DB into user‑time‑zone times?)
여기서 웹 애플리케이션에서 SQLAlchemy와 PostgreSQL을 사용하고 있습니다.
내 SQLA 모델은 대략 다음과 같이 정의됩니다.
class MyModel(Base):
ts_field = Column(DateTime(timezone=True))
# more here, obviously
내 웹 앱 사용자에게는 타임스탬프를 표시하는 방법을 결정하는 형식이 아직 지정되지 않은(이 질문의 일부임) timezone
속성이 있습니다. 그것들이 모두 서버의 로케일에 있는 것은 아니므로 시스템 시간대는 정확히 유용하지 않습니다.
각 사용자에 따라 형식이 지정된 타임스탬프를 쉽게 얻을 수 있는 방법을 알고 싶습니다. 선택한 시간대를 선택했습니다.
(저는 시간대 변환에 대한 많은 용어에 대해 다소 모호하기 때문에 이것을 막연하게 묻는다면 ‑‑ 그리고 제가 장담할 수 있습니다! ‑‑ 제발 자유롭게 댓글을 달아 설명을 도와주세요!)
참조 솔루션
방법 1:
OK, when you create a timestamp with timezone (shortcut name timestamptz) pg creates a timestamp, and converts between the current timezone to GMT when storing it.
When you pull it out, you change the timezone setting to whatever you want to change it to some other offset. For example:
smarlowe=# set timezone='est';
SET
smarlowe=# select now();
now
2010‑11‑30 00:38:32.683625‑05
(1 row)
smarlowe=# set timezone='mst';
SET
smarlowe=# select now();
now
2010‑11‑29 22:38:48.293708‑07
You can shorten this up by using "at time zone" nomenclature:
smarlowe=# set timezone='mst';
SET
smarlowe=# select now();
now
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
2010‑11‑29 22:40:15.854833‑07
(1 row)
smarlowe=# select now() at time zone 'est';
timezone
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
2010‑11‑30 00:40:17.243828
no need to set each time zone over and over, just in the statement each time according to the proper timezone.
방법 2:
You can use pytz to do the conversions.
(by Chris R、Scott Marlowe、nmichaels)