首頁 > 後端開發 > Python教學 > 時區、偏移和 ObjectScript,天哪!

時區、偏移和 ObjectScript,天哪!

Patricia Arquette
發布: 2025-01-01 13:06:13
原創
785 人瀏覽過

您的使命

讓我們假設您是國際行動間諜,一生致力於保護世界人民免受危險。 您收到以下任務:

美好的一天,特工 IRIS,

我們很抱歉打擾您在巴哈馬的假期,但我們剛剛收到倫敦代理的消息,一顆「定時炸彈」將在洛杉磯人口稠密的地區引爆。 我們的消息來源稱,「定時炸彈」將於今天下午 3:14 觸發。

快點,人們指望著你!

問題

你趕緊站起來,準備前往洛杉磯,但你很快意識到你錯過了一條關鍵信息; “定時炸彈”會在巴哈馬時間下午 3:14 或洛杉磯時間下午 3:14 觸發嗎? ……甚至可能是倫敦時間下午 3:14。

您很快就意識到,為您提供的時間(下午 3:14)並沒有為您提供足夠的資訊來確定您何時需要到達洛杉磯。

提供給您的時間(下午 3:14)不清楚。 您需要更多資訊來確定準確時間。

一些解決方案

當您思考這個問題時,您意識到有一些方法可以克服為您提供的時間的模糊性:

  1. 您的消息來源可能提供了當地時間下午 3:14 的位置。 例如,洛杉磯、巴哈馬或倫敦。

  2. 您的消息來源可以使用 UTC(協調世界時)等標準來為您提供與商定位置(例如倫敦格林威治)的偏移量。

幸福的結局

您致電消息來源並確認所提供的時間確實是洛杉磯時間下午 3:14。 您可以前往洛杉磯,在下午3:14之前解除“定時炸彈”,並迅速返回巴哈馬結束您的假期。

重點

那麼,這個思考練習的意義是什麼? 我懷疑我們中的任何人都會遇到上述問題,但如果您使用將資料從一個位置移動到另一個位置的應用程式或程式碼(特別是如果這些位置位於不同時區),您需要注意 如何處理日期時間和時區。

時區很難!

嗯,時區並沒有那麼糟。 夏令時和政治邊界使時區變得困難。

我以為我一直理解時區的「一般」概念:地球按時區分成垂直的切片,每個時區比東部時區晚一小時。

Time Zones and Offsets and ObjectScript, Oh My!

雖然這種簡化適用於許多地點,但不幸的是,這條規則有許多例外。

Time Zones and Offsets and ObjectScript, Oh My!
參考:世界時區(維基百科)

使用 UTC(“起源”)進行標準化

為了簡化傳達特定時間的語言,世界決定使用 UTC(協調世界時)。 該標準將“原點”設定為經過倫敦格林威治的 0° 經度。

定義“偏移”

以UTC為基礎,所有其他時區都可以相對於UTC來定義。 這種關係稱為 UTC 偏移量

如果你有本地時間和偏移量,你就不再有模糊的時間(如上面我們的間諜示例所示);你有一個明確且具體的時間,沒有任何含糊之處。

用來顯示 UTC 偏移的典型格式是 ±HHMM[SS[.ffffff]]。

  • 減號表示向 UTC 西邊的偏移。
  • 加號表示向 UTC 東部的偏移。
  • HH 表示小時(以零填充)
  • MM 表示分鐘(零填充)
  • SS 表示秒(以零填充)
  • .ffffff 表示秒小數

例如,在美國,東部標準 Zime 區域 (EST) 定義為 -0500 UTC。 這意味著 EST 中的所有地點都比 UTC 晚 5 小時。 如果 UTC 時間為晚上 9:00,則 EST 當地時間為下午 4:00。

在澳洲中西部標準時區 (ACWST),偏移量定義為 0845 UTC。 如果 UTC 時間為凌晨 1:00,則 ACWST 當地時間為上午 9:45。

夏令時

那麼,回到上面的時區地圖。 從圖像中,您可以看到許多時區遵循國家和地區的政治邊界。 這會使時區計算稍微複雜一些,但很容易理解。

不幸的是,在處理時間和時區時還需要考慮一個因素。

讓我們來看看洛杉磯。

在地圖上,洛杉磯的 UTC 偏移量在標準時間中為 -8。 冬季通常採用標準時間,而夏季通常採用夏令時

夏令時 (DST) 將給定時區的時鐘提前(通常在夏季月份提前一小時)。 政治區域選擇遵循夏令時的原因有很多(例如節能、更好地利用日光等)。 夏令時的困難和複雜性在於,世界各地並未一致遵循夏令時。 根據您所在的位置,您所在的地區可能遵循也可能不遵循夏令時。

時區資料庫

由於政治邊界和夏令時的結合大大增加了確定特定時間的複雜性,因此需要時區資料庫來將當地時間正確映射到相對於 UTC 的特定時間。 網路號碼分配機構 (IANA) 時區資料庫是作業系統和程式語言使用的時區資訊的常見來源。

資料庫包含所有時區的名稱和別名、偏移量資訊、夏令時使用資訊、時區縮寫以及各種規則適用的日期範圍。

有關時區資料庫的副本和資訊可以在 IANA 網站上找到。

大多數 UNIX 系統都有一個資料庫副本,該副本透過作業系統的套件管理器(通常安裝在 /usr/share/zoneinfo 中)進行更新。 一些程式語言內建了資料庫。 其他人透過圖書館提供它或可以讀取系統的資料庫副本。

時區名稱/識別符

時區資料庫包含許多特定時區的名稱和別名。 許多條目的名稱中都包含國家(或大陸)和主要城市。 例如:

  • 美國/紐約
  • 美國/洛杉磯
  • 歐洲/羅馬
  • 澳洲/墨爾本

使用 ObjectScript 進行轉換和格式化

所以,現在我們知道:

  • 當地時間(沒有偏移或位置的模糊時間)
  • UTC 偏移量(時間戳或位置相對於倫敦格林威治的 UTC「原點」的相對偏移)
  • 夏令時(以時區偏移為代價來幫助文明的嘗試)
  • 時區資料庫(其中包括許多地點和地區的時區和夏令時遵守情況的資訊)

了解了這一點,我們如何在 ObjectScript 中使用日期時間/時區?

***注意:我相信以下所有關於 ObjectScript 的陳述都是正確的,但如果我錯誤地表達了 ObjectScript 如何處理時區和偏移量,請告訴我。

內建變數和函數

如果您需要在執行 IRIS 的進程的系統時區內的各種格式之間轉換時間戳,ObjectScript 的內建功能應該就夠了。 以下是 ObjectScript 中各種與時間相關的變數/函數的簡要列表:

  • $ZTIMESTAMP / $ZTS

    • IRIS 內部格式為 UTC 值(偏移量 0000)。
    • 格式:ddddd,sssss.ffffffff
  • $NOW(tzmins)

    • 目前系統本地時間以及給定的 tzmins 與 UTC 的偏移量。
    • 不考慮夏令時。
    • 預設情況下,tzmins 是基於 $ZTIMEZONE 變數。
    • 格式:ddddd,sssss.ffffffff
  • $HOROLOG

    • 目前系統本地時間(基於 $ZTIMEZONE),考慮夏令時。
    • 格式:ddddd,sssss.ffffffff
  • $ZTIMEZONE

    • 返回或設定係統本地 UTC 偏移量(以分鐘為單位)。
  • $ZDATETIME() / $ZDT()

    • 將 $HOROLOG 格式轉換為特定的顯示格式。
    • 可用來將系統本地時間轉換為 UTC ( 0000)。
  • $ZDATETIMEH() / $ZDTH()

    • 將日期時間字串轉換為內部 $HOROLOG 格式。
    • 可用於從 UTC ( 0000) 轉換為系統本地時間。

據我所知,這些函數只能使用本地系統的時區來操作日期時間。 似乎沒有辦法在 ObjectScript 中處理任意時區。

進入 Open Exchange 上的 tz 圖書館

為了適應任意時區之間的轉換,我建立了 tz - ObjectScript 時區轉換庫。

此程式庫存取系統上安裝的時區資料庫,為時區和格式之間的時間戳轉換提供支援。

例如,如果您有洛杉磯本地時間(美國/洛杉磯),您可以將其轉換為巴哈馬使用的時區(美國/紐約)或倫敦使用的時區(歐洲/倫敦):

USER>zw ##class(tz.Ens).TZ("2024-12-20 3:14 PM", "America/Los_Angeles", "America/New_York")
"2024-12-20 06:14 PM"

USER>zw ##class(tz.Ens).TZ("2024-12-20 3:14 PM", "America/Los_Angeles", "Europe/London")
"2024-12-20 11:14 PM"
登入後複製

如果給您一個帶有偏移量的時間戳,您可以將其轉換為澳大利亞尤克拉 (Australia/Eucla) 的當地時間,即使您不知道原始時區:

USER>zw ##class(tz.Ens).TZ("2024-12-20 08:00 PM -0500", "Australia/Eucla")
"2024-12-21 09:45 AM +0845"
登入後複製

如果您使用 HL7 訊息,tz 庫有多種暴露於互通性規則和 DTL 的方法,可幫助您輕鬆在時區、本地時間、帶偏移量的時間等之間進行轉換:

// Convert local time from one time zone to another      
set datetime = "20240102033045"
set newDatetime = ##class(tz.Ens).TZ(datetime,"America/New_York","America/Chicago")

// Convert local time to offset      
set datetime = "20240102033045"
set newDatetime = ##class(tz.Ens).TZOffset(datetime,"America/Chicago","America/New_York")

// Convert offset to local time      
set datetime = "20240102033045-0500"
set newDatetime = ##class(tz.Ens).TZLocal(datetime,"America/Chicago")

// Convert to a non-HL7 format   
set datetime = "20240102033045-0500"
set newDatetime = ##class(tz.Ens).TZ(datetime,"America/Chicago",,"%m/%d/%Y %H:%M:%S %z")
登入後複製

概括

感謝您跟隨我踏上這次“國際之旅”,我們遇到了時區、夏令時、世界地圖和“定時炸彈”。 希望這能夠闡明(並簡化)處理日期時間和時區的許多複雜性。

查看 tz - ObjectScript 時區轉換庫,如果您有任何問題(或對我所說的內容進行更正/澄清),請告訴我。

謝謝!

參考資料/有趣的鏈接

  • https://en.wikipedia.org/wiki/Cooperative_Universal_Time
  • https://en.wikipedia.org/wiki/Time_zone
  • https://en.wikipedia.org/wiki/Daylight_ saving_time
  • https://www.worldtimeserver.com/learn/unusual-time-zones/
  • https://www.worldtimeserver.com/learn/history-of-time-zones/
  • https://www.worldtimeserver.com/learn/what-is-a-time-zone/
  • https://en.wikipedia.org/wiki/Tz_database
  • https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  • https://en.wikipedia.org/wiki/Internet_Assigned_Numbers_Authority
  • https://www.iana.org/time-zones
  • https://www.gnu.org/software/libc/manual/html_node/Calendar-Time.html

以上是時區、偏移和 ObjectScript,天哪!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板