檢視原始碼 Calendar.TimeZoneDatabase 行為 (Elixir v1.16.2)
此模組定義一個行為,用於提供時區資料。
IANA 提供時區資料,其中包含關於不同 UTC 偏移和時區標準偏移的資料。
摘要
類型
@type time_zone_period() :: %{ optional(any()) => any(), utc_offset: Calendar.utc_offset(), std_offset: Calendar.std_offset(), zone_abbr: Calendar.zone_abbr() }
特定 UTC 偏移、標準偏移和時區縮寫組合生效的期間。
例如,一個期間可能是 Europe/London
時區 2018 年的夏季,當時夏令時間/日光節約時間生效,並且持續從春季到秋季。在秋季,std_offset
會隨著 zone_abbr
一起變更,因此在冬季需要不同的期間。
@type time_zone_period_limit() :: Calendar.naive_datetime()
特定時區期間開始或結束的限制。
開始時間包含在內。結束時間不包含在內。例如,如果一個期間從 2015-03-29 01:00:00
到 2015-10-25 01:00:00
,則該期間包含並從 2015-03-29 01:00:00
開始,並持續到 2015-10-25 01:00:00
之前。
某些期間的開始或結束時間是無限的,例如沒有夏令時間或計畫變更的時區的最新期間。然而,為了此行為,它們僅用於牆上時間的間隙,其中所需的期間限制在某個時間。
回呼
@callback time_zone_period_from_utc_iso_days(Calendar.iso_days(), Calendar.time_zone()) :: {:ok, time_zone_period()} | {:error, :time_zone_not_found | :utc_only_time_zone_database}
特定時區在 UTC 中某個時間點的時區期間。
取得時區名稱和 UTC 的時間點,並傳回該時間點的 time_zone_period
。
@callback time_zone_periods_from_wall_datetime( Calendar.naive_datetime(), Calendar.time_zone() ) :: {:ok, time_zone_period()} | {:ambiguous, time_zone_period(), time_zone_period()} | {:gap, {time_zone_period(), time_zone_period_limit()}, {time_zone_period(), time_zone_period_limit()}} | {:error, :time_zone_not_found | :utc_only_time_zone_database}
特定時區和牆上時鐘日期時間的可能時區期間。
當提供的基本日期時間不明確時,傳回一個包含 :ambiguous
和兩個可能時期的元組。元組中的時期必須排序,第一個元素是首先開始的元素。
當提供的基本日期時間處於間隙中,例如從冬令時間轉換到夏令時間的「春季前進」期間,傳回一個包含 :gap
和兩個具有嵌套元組中限制的時期的元組。第一個嵌套的二元組是間隙之前的時期和一個具有時期結束時間限制(牆上時間)的基本日期時間。第二個嵌套的二元組是間隙之後的時期和一個日期時間(牆上時間),表示時期在間隙之後開始的時間。
如果提供的 datetime
僅有一個可能的時期,則傳回一個包含 :ok
和 time_zone_period
的元組。