전체 시스템이 “유럽 / 비엔나”임에도 불구하고 PostgreSQL에서 사용하는 시간대가 GMT 인 여러 PostgreSQL 9.2 설치가 있습니다. 설정이 포함되어 postgresql.conf
있지 않은지 다시 확인 timezone
했으므로 설명서에 따르면 시스템 시간대로 대체되어야합니다.
하나,
# su -s /bin/bash postgres -c "psql mydb"
mydb=# show timezone;
TimeZone
----------
GMT
(1 row)
mydb=# select now();
now
-------------------------------
2013-11-12 08:14:21.697622+00
(1 row)
GMT 시간대의 출처는 무엇입니까? 시스템 사용자는하지 않는 TZ
설정하고 /etc/timezone
하고 /etc/timeinfo
올바르게 구성 될 것으로 보인다.
# cat /etc/timezone
Europe/Vienna
# date
Tue Nov 12 09:15:42 CET 2013
어떤 힌트라도 미리 감사드립니다!
답변
TimeZone
릴리스 9.2 에서 설정 의 기본값 이 변경되었습니다.
(..) 명시 적으로 설정되지 않은 경우, 서버는이 변수를 시스템 환경에서 지정한 시간대로 초기화합니다. (…)
(…) 내장 된 기본값은 GMT이지만 postgresql.conf에서 대체됩니다. initdb는 시스템 환경에 맞는 설정을 설치합니다. (…)
즉, 버전 9.2 이전의 단계 에서 기본값을 postgresql.conf
설정해야합니다 initdb
. 해당 값을 재정의 한 경우 ( postgresql.conf
이전 버전에서 업그레이드하는 동안 이전 버전을 복사 하는 경우) PostgreSQL은 “GMT”값을 기본값으로 사용합니다.
귀하의 경우에 대한 해결책은 매우 간단합니다. TimeZone
설정 postgresql.conf
을 원하는 값으로 변경하십시오 .
TimeZone = 'Europe/Vienna'
그 후 reload
서비스 가 필요합니다 .
# su - postgres -c "psql mydb -c 'SELECT pg_reload_conf()'"
그러면 timestamp with time zone
(또는 timestamptz
) 으로 저장된 모든 필드 가 지금부터 올바르게 표시됩니다. 그러나 timestamp without time zone
(또는 timestamp
)으로 저장된 필드를 모두 수동으로 수정해야합니다 .
PostgreSQL을 업그레이드하는 모든 사람에게 팁은 이전 postgresql.conf
클러스터를 새 클러스터 에 복사 하지 않는 것입니다. 에 의해 생성 된 것을 가져 와서 initdb
수정 사항을 추가하십시오 ( diff
도구 가이 작업에 도움이 될 수 있습니다).
답변
이에 대한 해결 방법을 찾았습니다.
/ usr / share / zoneinfo / 안에 localtime (또는 원하는 이름) 이라는 심볼릭 링크를 만들어 / etc / localtime을 가리 킵니다.
/usr/share/zoneinfo/localtime -> /etc/localtime
이렇게하면 궁극적으로 시스템 시간대를 가리키는 링크 문자열을 만들 수 있습니다.
/etc/localtime -> /usr/share/zoneinfo/America/Los_Angeles
이제 생성 한 링크 이름 ( 필자의 경우 현지 시간 )을 postgresql.conf의 구성 항목 값으로 사용하십시오.
TimeZone = 'localtime'
postgresql을 다시 시작하고 “SELECT now ();”로 시간을 확인하십시오. “표준 시간대 표시”