查看源代码 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 偏移量、标准偏移量和时区缩写组合有效。
例如,一个时期可能是 2018 年夏季的 Europe/London
时区,其中夏令时/夏令时有效,从春季持续到秋季。秋季,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
之前。
某些时期的开始或结束是无限的,例如没有 DST 或计划更改的时区的最新时期。但是,出于此行为的目的,它们仅用于挂钟时间中的间隙,其中所需的时期限制在某个时间。
回调
@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
的元组。