全部產品
Search
文件中心

Hologres:時區

更新時間:Feb 04, 2026

由於世界各國家與地區所處經度不同,地方時也不同,因此會劃分為不同的時區。本文將會為您介紹在Hologres中時區的相關資訊。

時區介紹

為了克服時間上的混亂,正式的時區劃分包括二十四個時區(東、西各十二個時區),其中英國(格林尼治天文台舊址)為中時區(零時區)、東1~12區(正數,+),西1~12區(負數,-)。每個時區橫跨經度十五度,時間正好是一小時。在國際上有兩種時區的表達,分別為GMT和UTC。

  • GMT 0:00

    是指格林尼治標準時間,這是以英國格林尼治天文台觀測結果得出的時間,這是英國格林尼治當地時間,這個地方的當地時間過去被當成世界標準時間。

  • UTC +00:00

    是指國際標準時間。因為地球自轉越來越慢,每年都會比前一年多出零點幾秒,每隔幾年國際標準時間組織都會給世界時加一秒,讓基於原子鐘的世界時和基於天文學(人類感知)的格林尼治標準時間相差不至於太大。並將得到的時間稱為UTC,這是現在使用的世界標準時間。

說明
  • 國際標準時間不與任何地區位置相關,也不代表此刻某地的時間,所以在說明某地時間時要加上時區。也就是說GMT並不等於UTC,而是等於UTC+0,即GMT = UTC+0,只是格林尼治剛好在零時區上。

  • +08是指時區為東八區,比零時區快八個小時。

Hologres相容PostgreSQL協議。PostgreSQL遵循POSIX時區規範,在使用GMTUTC修改時區時,其位移量符號與上述符號相反,即負號表示東時區。在Hologres中所有日期和時間都用全球統一時間UTC格式儲存,所有Region預設是UTC-08(中國東八區時間),比世界協調時間(UTC)和格林尼治時間(GMT)快八小時的時區。同時Hologres提供兩種儲存時間戳記的資料類型:不帶時區的TIMESTAMP和帶時區的TIMESTAMPTZ。

說明

帶有時區的資料建議都使用TIMESTAMPTZ類型儲存。

名稱

說明

精度

資料顯示樣本

TIMESTAMP

格式為日期+時間,不帶時區資訊。

儲存的資料與寫入的資料一樣,當修改了用戶端的時區時,裡面儲存的資料的值不會改變,即用戶端展示的是寫入的未經處理資料,沒有時區位移。

微秒

2022-01-01 01:01:01.123456

TIMESTAMP WITH TIME ZONE(TIMESTAMPTZ)

格式為日期+時間,帶時區資訊。

Hologres使用UTC時區的值來儲存TIMESTAMPTZ資料。在向TIMESTAMPTZ欄位插入值的時候, Hologres會自動將用戶端時區的值轉換成UTC時區,在展示查詢結果的時候,根據用戶端TimeZone配置參數聲明的時區轉換為用戶端時間。

毫秒

2022-02-01 10:33:20.125+08

查看預設的時區

  • 查看當前用戶端的時區。

    show timezone;
    說明
    • 在Holoweb中執行的結果為執行個體的預設時區(PRC)對應東八區。

    • 如果使用其他開發工具,查詢結果不是預設時區,則說明更改過用戶端時區配置。

  • 通過查詢系統資料表查看每個地區對應的時區。

    在Postgres中通過系統資料表pg_timezone_names儲存不同地區的預設時區資訊,可以通過如下命令查詢系統資料表查看每個地區對應的時區。

    select * from pg_timezone_names;

    系統資料表參數說明如下。

    參數

    類型

    描述

    name

    text

    時區名稱。

    abbrev

    text

    時區縮寫。

    utc_offset

    interval

    UTC位移時區,正數(+)表示格林威治以東,負數(-)表示格林威治以西。

    is_dst

    boolean

    如果當前正在觀察夏令時,則為真(t),否則為否(f)。

修改用戶端時區

  • Hologres中允許使用以下幾種形式指定時區。

    • 完整的時區名稱:例如America/New_York。

    • UTC時區的位移:例如-08:00:00或UTC-08表示東八區,由於遵循POSIX時區規範,在使用GMT或UTC表示時區時,其位移量符號與上述符號相反,因此負號(-)表示東時區。

Hologres中的常用時區及其對應參數值如下所示。

地區

時區

完整時區名

UTC時區的位移

  • 中國

  • 新加坡

  • 馬來西亞(吉隆坡)

東八區

  • PRC

  • Asia/Shanghai

  • Asia/Singapore

  • Asia/Kuala_Lumpur

UTC-08

日本(東京)

東九區

Asia/Tokyo

UTC-09

印尼(雅加達)

東七區

Asia/Jakarta

UTC-07

德國(法蘭克福)

東一區

Europe/Berlin

UTC-01

美國(維吉尼亞)

西五區

  • US/Eastern

  • America/New_York

UTC+05

美國(矽谷)

西八區

  • US/Pacific

  • America/Los_Angeles

UTC+08

  • 修改用戶端時區

    Hologres的時區預設按照UTC儲存,所有Region預設為UTC-08(中國東八區)。可以通過修改用戶端時區參數達到用戶端顯示不同時區的目的。通過以下命令進行修改用戶端顯示時區。

    說明

    修改時區是修改用戶端展示時區,並不是修改底層儲存的真即時區資訊。

    • Session層級

      通過set命令可以在Session層級設定GUC參數。Session層級的參數只在當前Session生效,當串連斷開之後將會失效,建議加在SQL前一起執行,使用方法如下。

      --修改為加拿大/東部時區
      set timezone ='Canada/Eastern';
      
      --修改為西五區
      set timezone ='05:30:00';           
    • 資料庫層級

      可以通過alter database <db_name> set <value>;命令來DB層級設定GUC參數。

      說明

      此命令執行完成後:

      • 在整個資料庫層級生效,設定完成後當前串連需要重新中斷連線才會生效。

      • 建立資料庫不會生效,需要重新手動設定。

      使用方法如下。

      --DB層級修改時區為'UTC'零時區
      alter database <db_name> set timezone = 'UTC-0';
      
      --DB層級修改時區為'UTC'西五時區
      alter database <db_name> set timezone = 'UTC+05';

不同資料來源與Hologres的時間類型映射

不同資料來源與Hologres有關時間的資料類型映射如下表,建議按照推薦映射關係進行映射,否則會出現資料不一致/時區偏差的情況。

資料來源

資料來源資料類型

來源資料樣本

Hologres資料類型

映射Hologres資料樣本

說明

MySQL

DATETIME

2001-07-14 02:14:19

TIMESTAMP

2001-07-14 02:14:19

MySQL的DATETIME儲存的是沒有時區的時間(可以理解為字串的時間格式),取值範圍為'1000-01-01 00:00:00' to '9999-12-31 23:59:59'

資料存放區時,會按照原始的時間格式儲存,不進行任何轉換,因此在Hologres中映射為TIMESTAMP類型。

TIMESTAMP

2019-02-23 05:21:16

TIMESTAMPTZ

2019-02-23 05:21:16+08

MySQL的TIMESTAMP預設是UTC時間,帶時區,取值範圍為'1970-01-01 00:00:01' UTC to ‘2038-01-19 03:14:07' UTC

資料存放區前會根據資料庫軟體佈建的時區(預設隨系統),將寫入的時間資料轉化為UTC時間後,再進行儲存。因此在Hologres映射為TIMESTAMPTZ類型。

MaxCompute

DATETIME

2021-11-29 00:01:00

TIMESTAMPTZ

2021-11-29 00:01:00.000+08

MaxCompute的DATETIME預設是UTC時間,取值範圍為‘0000-1-1’ to ‘9999-12-31’,精確到毫秒。因此在Hologres中映射為TIMESTAMPTZ類型。

TIMESTAMP

2021-01-11 00:00:00.123456789

TIMESTAMPTZ

2021-01-11 00:00:00.123+08

MaxCompute的TIMESTAMP預設是UTC時間,取值範圍為'0000-01-01 00:00:00.000000000' to '9999-12-31 23.59:59.999999999',精確到納秒。因此在Hologres中映射為TIMESTAMPTZ類型。

說明

說明:Hologres底層會將納秒轉換為毫秒,無需關心精度問題。

Flink

TIMESTAMP

2007-04-30 13:10:02.047

TIMESTAMPTZ

2007-04-30 13:10:02.047+08

Flink的TIMESTAMP類型預設是UTC時間,精確到毫秒,因此在Hologres中映射為TIMESTAMPTZ類型。

DataHub

TIMESTAMP

2020-03-05 10:10:00.123456+08

TIMESTAMPTZ

2020-03-05 10:10:00.123+08

DataHub的TIMESTAMP精確到微秒,使用UTC時間,Hologres Connector在寫入過程中會自動將資料時區變為零時區,因此在Hologres中映射為TIMESTAMPTZ類型。

常見問題

  • DataHub即時同步資料至Hologres,Hologres的欄位類型為TIMESTAMP,DataHub欄位類型為TIMESTAMP,寫入後Hologres中時間比實際少八個小時。

    • 可能原因:Hologres Connector在寫入過程中,會自動將資料時區變為零時區。如果Hologres欄位設定為TIMESTAMP,不會帶時區,寫入後還是零時區,因此會少八個小時。

    • 解決方案:重建立表,將Hologres中的欄位改成TIMESTAMPTZ。

  • DataHub即時同步資料至Hologres,Hologres的欄位類型為TIMESTAMPTZ,Tableau展示的時候與Hologres的時間差八個小時。

    • 可能原因:Tableau前端時區展示問題。

    • 解決方案:HoloWeb的時區預設為UTC-08(東八區),可以通過HoloWeb查看是否符合真實資料,然後在Tableau建立串連的時候,可以在Initial SQL(初始 SQL)裡修改時區,命令樣本如下。

      --修改為按照東八區顯示
      set timezone to 'Asia/Shanghai';
  • MySQL資料同步到Hologres後時間顯示為什麼會出現+08

    • 可能原因:+08代表的是當前用戶端展示的是東八區時區,並不是資料是東八區。

    • 解決方案:通過修改用戶端時區為指定的時區。

  • JDBC裡面如何設定時區?

    JDBC的時區顯示預設同JVM時區,如果需要修改JDBC的時區顯示,需要串連JDBC後,執行以下SQL進行修改。

    -- 修改為東七區
    set timezone = '+07';