區(qū)轉(zhuǎn)換)
文章目錄1、問(wèn)題引入2、時(shí)間解析2.1 什么是 UTC 時(shí)間2.1.1 UTC 是全球統(tǒng)一的時(shí)間基準(zhǔn)2.1.2 UTC 和 GMT 的關(guān)系2.2 什么是北京時(shí)間CST2.2.1 北京時(shí)間沒(méi)有夏令時(shí)切換2.3 什么是 PST 和 PDT2.3.1 PSTPacific Standard Time2.3.2 PDTPacific Daylight Time2.3.3 PST 與 PDT 的關(guān)系2.4 PST/PDT 與北京時(shí)間相差多少3、跨時(shí)區(qū)項(xiàng)目一般怎么處理原則一后端和數(shù)據(jù)層統(tǒng)一使用 UTC原則二展示時(shí)才轉(zhuǎn)成用戶(hù)當(dāng)?shù)貢r(shí)間4、我的項(xiàng)目怎么處理4.1 查看MySQL Server 和 Session 當(dāng)前使用的時(shí)區(qū)4.2 查看命名時(shí)區(qū)表是否已經(jīng)加載4.3 開(kāi)啟時(shí)區(qū)數(shù)據(jù)庫(kù)4.3.1 windows系統(tǒng)4.3.2 Linux系統(tǒng)4.3.4 云數(shù)據(jù)庫(kù)4.3.3 驗(yàn)證我的網(wǎng)站原文 https://eleanora-lyh.github.io/MyLearningNotes/csdn處的文章會(huì)盡快同步更新歡迎大家來(lái)訪問(wèn)1、問(wèn)題引入先介紹一下上游數(shù)據(jù)L1事件明細(xì)記錄了Web 側(cè)事件級(jí)遙測(cè)數(shù)據(jù)包含用戶(hù)行為及部分系統(tǒng)/測(cè)試/機(jī)器人事件。此文件每一個(gè)小時(shí)記錄會(huì)生成一個(gè)每個(gè)大小為5-30TB左右。假設(shè)當(dāng)前時(shí)間為curr_time我們需要得到curr_time-2h, curr_time-1h, curr_time, curr_time1h共計(jì)四個(gè)文件才能開(kāi)始當(dāng)前時(shí)間為curr_time的計(jì)算任務(wù)。每?jī)蓚€(gè)小時(shí)開(kāi)始一個(gè)這樣的計(jì)算任務(wù)也就是說(shuō)一天需要完成12個(gè)并生成對(duì)應(yīng)12個(gè)文件每個(gè)計(jì)算任務(wù)完成都會(huì)在數(shù)據(jù)庫(kù)插入一條記錄。目前的保障措施因?yàn)樯嫌螖?shù)據(jù)數(shù)據(jù)達(dá)到的時(shí)間不確定所以如果想保證計(jì)算任務(wù)順利執(zhí)行在設(shè)計(jì)ETL流程時(shí)會(huì)根據(jù)當(dāng)前時(shí)間預(yù)判可能的到達(dá)時(shí)間并wait10h在此期間如果需要的所有上游文件都到達(dá)就會(huì)觸發(fā)計(jì)算任務(wù)。同時(shí)增加了對(duì)上游數(shù)據(jù)的監(jiān)控在規(guī)定時(shí)間范圍內(nèi)未到達(dá)就會(huì)觸發(fā)通知。但這樣做還是有一個(gè)遺漏之處就是是上游文件在規(guī)定時(shí)間范圍內(nèi)到達(dá)但是由于計(jì)算任務(wù)時(shí)間過(guò)長(zhǎng)或者計(jì)算量太大就會(huì)導(dǎo)致計(jì)算任務(wù)無(wú)法準(zhǔn)時(shí)完成。而目前監(jiān)控計(jì)算任務(wù)是否完成只能通過(guò)肉眼去查文件是否生成。因此引入我的任務(wù)在grafana中新建一個(gè)dashboard來(lái)可視化計(jì)算任務(wù)的結(jié)果用來(lái)判斷計(jì)算任務(wù)是否完成實(shí)現(xiàn)過(guò)程也很簡(jiǎn)單去查對(duì)應(yīng)時(shí)間的數(shù)據(jù)庫(kù)內(nèi)是否有計(jì)算任務(wù)完成的記錄構(gòu)造本應(yīng)在一天中生成的12個(gè)文件行將其與數(shù)據(jù)庫(kù)進(jìn)行Join對(duì)的上的標(biāo)記為存在對(duì)不上的標(biāo)記為不存在。在實(shí)現(xiàn)的過(guò)程中我發(fā)現(xiàn)自己踩了時(shí)區(qū)轉(zhuǎn)化的坑導(dǎo)致dashboard中展示的計(jì)算結(jié)果的create_time和實(shí)際create_time不同具體踩坑點(diǎn)如下grafana的dashboard中有時(shí)間范圍篩選其默認(rèn)時(shí)區(qū)為北京時(shí)間Mysql數(shù)據(jù)庫(kù)的時(shí)區(qū)為UTC時(shí)間計(jì)算任務(wù)生成的結(jié)果存儲(chǔ)在Azure云上其時(shí)區(qū)為PDT時(shí)間這樣就導(dǎo)致了同一條記錄在不同的地方查詢(xún)顯示/操作的create_time都是不同的所以此文章介紹一下時(shí)區(qū)轉(zhuǎn)換2、時(shí)間解析2.1 什么是 UTC 時(shí)間2.1.1 UTC 是全球統(tǒng)一的時(shí)間基準(zhǔn)UTC 全稱(chēng)Coordinated Universal Time協(xié)調(diào)世界時(shí)它不是某個(gè)國(guó)家或城市的地方時(shí)間而是全球系統(tǒng)進(jìn)行時(shí)間同步時(shí)使用的基準(zhǔn)。常見(jiàn)表示方式2026-07-31T06:30:00Z2026-07-31日期T日期和時(shí)間的分隔符06:30:00時(shí)、分、秒Z表示 UTC也叫 Zulu Time2.1.2 UTC 和 GMT 的關(guān)系日常業(yè)務(wù)中UTC0和GMT0兩者通??梢砸暈橄嗤频拍钌喜⒉煌耆嗤琔TCCoordinated Universal Time現(xiàn)代時(shí)間標(biāo)準(zhǔn)基于原子鐘等時(shí)間體系。GMT Greenwich Mean Time格林尼治平均時(shí)最初基于天文觀測(cè)也常被用作時(shí)區(qū)名稱(chēng)。對(duì)于日志、數(shù)據(jù)庫(kù)、API、Pipeline 和告警系統(tǒng)建議統(tǒng)一使用UTC而不是 GMT。2.2 什么是北京時(shí)間CST北京時(shí)間CST通常指China Standard TimeCST常表示為 UTC08:00換算關(guān)系UTC 2026-07-31 16:30對(duì)應(yīng)北京時(shí)間 2026-08-01 00:30注意減去或加上 8 小時(shí)后日期也可能變化2.2.1 北京時(shí)間沒(méi)有夏令時(shí)切換目前中國(guó)標(biāo)準(zhǔn)時(shí)間全年固定為UTC8因此在當(dāng)前規(guī)則下夏天是 UTC8冬天也是 UTC8不存在北京時(shí)間突然跳過(guò)一小時(shí)或重復(fù)一小時(shí)的問(wèn)題不過(guò)跨時(shí)區(qū)項(xiàng)目中不要把它簡(jiǎn)單寫(xiě)成模糊的CST。因?yàn)镃ST可能被解釋為China Standard TimeCentral Standard TimeCuba Standard Time更明確的寫(xiě)法是UTC08:00和Asia/Shanghai2.3 什么是 PST 和 PDTPST 和 PDT 都與北美太平洋時(shí)區(qū)有關(guān)他們是北美太平洋時(shí)區(qū)在不同月份范圍的細(xì)分時(shí)區(qū)但是可以統(tǒng)稱(chēng)為Pacific Time縮寫(xiě)為PT即PT PST 或 PDT按美國(guó)現(xiàn)行的一般規(guī)則夏令時(shí)從每年 3 月第二個(gè)星期日開(kāi)始到 11 月第一個(gè)星期日結(jié)束。這個(gè)時(shí)間范圍內(nèi)采用PDT時(shí)區(qū)剩余時(shí)間范圍采用PST時(shí)區(qū)。2.3.1 PSTPacific Standard Time太平洋標(biāo)準(zhǔn)時(shí)間 Pacific Standard Time 縮寫(xiě)PST主要對(duì)應(yīng)不使用夏令時(shí)(DST)的時(shí)期UTC 偏移UTC-8比 UTC 慢 8 小時(shí)使用地區(qū)美國(guó)西海岸加州、華盛頓州、俄勒岡州、內(nèi)華達(dá)州等、加拿大不列顛哥倫比亞省主要城市包括洛杉磯、舊金山、西雅圖、波特蘭、溫哥華啟用時(shí)段每年11 月第一個(gè)星期日到次年3 月第二個(gè)星期日即冬令時(shí)夏令時(shí)切換3 月第二個(gè)星期日起切換為PDTUTC-711 月第一個(gè)星期日回切到 PST2.3.2 PDTPacific Daylight Time太平洋夏令時(shí)間 Pacific Daylight TimePDT 在實(shí)行夏令時(shí)期間使用UTC 偏移PDT UTC-7比 UTC 晚 7 小時(shí)使用地區(qū)美國(guó)西海岸加州、華盛頓州、內(nèi)華達(dá)州、俄勒岡州等、加拿大不列顛哥倫比亞省主要城市包括洛杉磯、舊金山、西雅圖、波特蘭、溫哥華等啟用時(shí)段每年3 月第二個(gè)星期日到11 月第一個(gè)星期日冬令時(shí)切換夏令時(shí)結(jié)束后切換回PSTPacific Standard Time太平洋標(biāo)準(zhǔn)時(shí)間UTC-8 注意PDT 只在夏令時(shí)期間有效3 月中11 月初。其余月份美國(guó)西海岸用的是 PSTUTC-8。如果你的業(yè)務(wù)時(shí)間跨度覆蓋全年不能簡(jiǎn)單地固定減 7 小時(shí)應(yīng)該用命名時(shí)區(qū)讓 MySQL 自動(dòng)處理切換CONVERT_TZ(utc_time,00:00,America/Los_Angeles)2.3.3 PST 與 PDT 的關(guān)系兩者指的是同一個(gè)地理區(qū)域的同一條時(shí)間線只是根據(jù)季節(jié)在標(biāo)準(zhǔn)時(shí)間和夏令時(shí)之間切換時(shí)段縮寫(xiě)全稱(chēng)UTC 偏移冬季11 月3 月PST?PacificStandard? TimeUTC-8夏季3 月11 月PDT?PacificDaylight? TimeUTC-7也就是說(shuō)PDT PST 1 小時(shí)。夏令時(shí)開(kāi)始時(shí)時(shí)鐘撥快 1 小時(shí)PST → PDT結(jié)束時(shí)撥慢 1 小時(shí)PDT → PST。 所以嚴(yán)格來(lái)說(shuō)Pacific TimePT是一個(gè)統(tǒng)稱(chēng)它底下分 PST 和 PDT 兩種狀態(tài)隨季節(jié)切換。2.4 PST/PDT 與北京時(shí)間相差多少已知PDT UTC-7PST UTC-8北京時(shí)間 UTC8所以可以得出太平洋當(dāng)?shù)貢r(shí)間UTC 偏移與北京時(shí)間的時(shí)差PSTUTC-8CSTPST16HPDTUTC-7CSTPST15H3、跨時(shí)區(qū)項(xiàng)目一般怎么處理原則一后端和數(shù)據(jù)層統(tǒng)一使用 UTC建議以下內(nèi)容全部保存為 UTC數(shù)據(jù)庫(kù)時(shí)間字段Pipeline 的運(yùn)行時(shí)間文件到達(dá)時(shí)間日志時(shí)間API 請(qǐng)求時(shí)間事件發(fā)生時(shí)間告警檢測(cè)時(shí)間消息隊(duì)列中的時(shí)間分布式系統(tǒng) Watermark審計(jì)記錄例如2026-07-31T06:30:00Z而不是只保存2026-07-31 14:30:00后者沒(méi)有說(shuō)明時(shí)區(qū)無(wú)法判斷它是北京時(shí)間、UTC 還是美國(guó)當(dāng)?shù)貢r(shí)間。原則二展示時(shí)才轉(zhuǎn)成用戶(hù)當(dāng)?shù)貢r(shí)間典型流程是事件發(fā)生 ↓ 轉(zhuǎn)換為 UTC ↓ 數(shù)據(jù)庫(kù)按 UTC 保存 ↓ API 返回 UTC ↓ 前端根據(jù)用戶(hù)時(shí)區(qū)顯示4、我的項(xiàng)目怎么處理因?yàn)橄氲氖翘鎿Q掉手動(dòng)去云存儲(chǔ)那里一個(gè)個(gè)查文件的過(guò)程所以dashboard這里顯示的時(shí)間要和云存儲(chǔ)的create_time一致MySQL create_time UTC 云存儲(chǔ) create_time 洛杉磯當(dāng)?shù)貢r(shí)間針對(duì)目標(biāo)查詢(xún)表加一層view視圖將轉(zhuǎn)為洛杉磯當(dāng)?shù)貢r(shí)間如下CONVERT_TZ(create_time,00:00,America/Los_Angeles)如果轉(zhuǎn)換完得到的時(shí)間為NULL是因?yàn)镸ySQL 必須查詢(xún)內(nèi)部時(shí)區(qū)表以確定America/Los_Angeles是否存在2026 年 7 月 31 日是否處于夏令時(shí)此時(shí)應(yīng)該使用 UTC-7 還是 UTC-8夏令時(shí)切換邊界如何處理當(dāng)前 MySQL 查不到對(duì)應(yīng)的時(shí)區(qū)規(guī)則因此返回NULL。解決辦法詳見(jiàn)下面的4.1、4.2、4.34.1 查看MySQL Server 和 Session 當(dāng)前使用的時(shí)區(qū)SELECTsystem_time_zoneASsystem_time_zone,global.time_zoneASglobal_time_zone,session.time_zoneASsession_time_zone;返回system_time_zoneglobal_time_zonesession_time_zoneChina Standard TimeSYSTEMSYSTEM4.2 查看命名時(shí)區(qū)表是否已經(jīng)加載SELECTCOUNT(*)AStimezone_countFROMmysql.time_zone_nameWHERENameAmerica/Los_Angeles;返回timezone_count04.3 開(kāi)啟時(shí)區(qū)數(shù)據(jù)庫(kù)要在 MySQL 中使用命名時(shí)區(qū)如America/Los_Angeles、Asia/Shanghai必須先把系統(tǒng)的IANA 時(shí)區(qū)數(shù)據(jù)庫(kù)zoneinfo加載進(jìn) MySQL 自帶的mysql.time_zone_*系統(tǒng)表里。否則CONVERT_TZ用命名時(shí)區(qū)時(shí)會(huì)返回NULL。4.3.1 windows系統(tǒng)windows系統(tǒng)則首先下載 MySQL 時(shí)區(qū)包MySQL :: Time zone description tables選擇timezone_2026c_posix_sql.zip解壓到對(duì)應(yīng)位置我的位置是C:\Users\v-liuyuhang\AppData\Roaming\DBeaverData\workspace6\General\timezone_posix.sql打開(kāi)cmd進(jìn)入mysql.exe所在目錄我的是 C:\Program Files\MySQL\MySQL Server 8.4\bin執(zhí)行命令mysql-uroot-pmysqlC:\Users\v-liuyuhang\AppData\Roaming\DBeaverData\workspace6\General\timezone_posix.sql4.3.2 Linux系統(tǒng)大多數(shù) Linux 發(fā)行版和 macOS 在 /usr/share/zoneinfo 下都有 IANA 數(shù)據(jù)庫(kù)直接用一行管道加載mysql_tzinfo_to_sql /usr/share/zoneinfo|mysql-uroot-pmysql4.3.4 云數(shù)據(jù)庫(kù)mysql--hostxxx.com--port3306--userxxx--password--ssl-modeREQUIRED mysqlC:\Users\v-liuyuhang\AppData\Roaming\DBeaverData\workspace6\General\timezone_posix.sql然后彈出 Enter password: 輸入密碼4.3.3 驗(yàn)證SELECTNOW()ASmysql_original_time,CONVERT_TZ(NOW(),00:00,America/Los_Angeles)ASlos_angeles_time,CONVERT_TZ(NOW(),00:00,08:00)ASbeijing_time;返回mysql_original_timelos_angeles_timebeijing_time2026-07-31 17:36:022026-07-31 10:36:022026-08-01 01:36:02