less than 1 minute read

基本檢視語法

檢視系統當前預設時區

show timezone;

檢視postgres支援時區

select * from pg_timezone_names;

Postgres 預設使用UTC時間,

容器預設時區

容器中若要使用其他時區, 可以透過環境變數TZ來設定, 例如:

docker run -it -e "TZ=GMT+2" postgres:alpine

或是

version: '3.7'
services:
  PGdb:
    image: pg
    build:
      context: .
      dockerfile: DockerfilePG
    container_name: db-pg
    restart: always
    environment:
      POSTGRES_PASSWORD: example 
      PGDATA: /var/lib/postgresql/data/pgdata # 更換預設 pg 儲存資料預設
      PGPORT: 5432
      POSTGRES_DB: prefect
      USER: $(id -u):$(id -g)
      TZ: 'Asia/Taipei'
    volumes:
      - ./pg_data/:/var/lib/postgresql/data
    profiles:
      - main
      - all
    ports:
      - "5432:5432"

其它注意事項

這邊有個坑, 若一開始沒注意, 已經開始使用UTC預設的資料庫
此時新增TZ變數, 重新啟動, 會發現資料庫時區不會隨著變數改變
因 postgres啟動時, 若發現資料庫已經存在資料, 則會跳過初始化的步驟, 因此會沿用已存在的資料庫資料的設定

hccuse@R075 ~ [1]> docker logs -f db-pg

PostgreSQL Database directory appears to contain a database; Skipping initialization

2024-02-29 06:52:16.400 UTC [1] LOG:  starting PostgreSQL 15.1 (Debian 15.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2024-02-29 06:52:16.459 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2024-02-29 06:52:16.459 UTC [1] LOG:  listening on IPv6 address "::", port 5432

因此, 若要更改時區, 可以選擇清空資料庫, 重啟容器,

或是直接使用SQL指令更改資料庫時區

SQL時區修改相關

修改單一資料庫時區

若已經使用預設時區建立資料庫, 可以參考以下指令,
demo為想修改的資料庫名稱, asia/Taipei為想設定的時區

ALTER DATABASE demo SET timezone TO 'asia/Taipei';

修改預設時區

修改預設時區 , 需注意此方式不會影響已經存在的資料庫, 只會影響新建立的資料庫
若要修改已經存在的資料庫, 需使用上述的指令

set timezone TO 'asia/Taipei';