查看源代码 时间 (Elixir v1.16.2)

时间结构体和函数。

时间结构体包含小时、分钟、秒和微秒字段。可以使用 new/4 函数或使用 ~T(参见 sigil_T/2)符号来构建新时间。

iex> ~T[23:00:07.001]
~T[23:00:07.001]

new/4 和符号都返回一个结构体,其中时间字段可以直接访问。

iex> time = ~T[23:00:07.001]
iex> time.hour
23
iex> time.microsecond
{1000, 3}

此模块中的函数可以使用 Time 结构体,以及任何包含与 Time 结构体相同字段的结构体,例如 NaiveDateTimeDateTime。此类函数在它们的类型规范中需要 Calendar.time/0(而不是 t/0)。

开发者应该避免直接创建时间结构体,而是依赖此模块提供的函数以及第三方日历库中的函数。

比较时间

在 Elixir 中使用 ==/2>/2</2 和类似的比较是结构化的,并且基于 Time 结构体的字段。为了正确比较时间,请使用 compare/2 函数。此模块中存在 compare/2 函数还允许使用 Enum.min/2Enum.max/2 函数来获取 Enum 中的最小和最大时间。例如

iex> Enum.min([~T[23:00:07.001], ~T[10:00:07.001]], Time)
~T[10:00:07.001]

摘要

函数

unit 单位的 amount_to_add 添加到给定的 time

如果第一个时间严格晚于第二个时间,则返回 true

如果第一个时间严格早于第二个时间,则返回 true

比较两个时间结构体。

将给定的 time 转换为不同的日历。

类似于 Time.convert/2,但如果两个日历之间的转换不可行,则引发 ArgumentError

返回两个时间之间的差值,仅考虑小时、分钟、秒和微秒。

将 Erlang 时间元组转换为 Time 结构体。

将 Erlang 时间元组转换为 Time 结构体。

解析由 ISO 8601:2019 描述的扩展“本地时间”格式。

解析由 ISO 8601:2019 描述的扩展“本地时间”格式。

将给定的 time 转换为 Erlang 时间元组。

将给定的时间转换为 ISO 8601:2019

Time 结构体转换为午夜后的秒数。

将给定的 time 转换为字符串。

返回给定的时间,其中微秒字段被截断到给定的精度(:microsecondmillisecond:second)。

返回 UTC 中的当前时间。

类型

@type t() :: %Time{
  calendar: Calendar.calendar(),
  hour: Calendar.hour(),
  microsecond: Calendar.microsecond(),
  minute: Calendar.minute(),
  second: Calendar.second()
}

函数

链接到此函数

add(time, amount_to_add, unit \\ :second)

查看源代码 (自 1.6.0 起)
@spec add(Calendar.time(), integer(), :hour | :minute | System.time_unit()) :: t()

unit 单位的 amount_to_add 添加到给定的 time

接受任何 unit 中的 amount_to_addunit 可以是 :hour:minute:second 或来自 System.time_unit/0 的任何亚秒精度。默认值为 :second。负值将向时间倒退。

此函数始终认为单位是根据 Calendar.ISO 计算的。

请注意,结果值表示一天中的时间,这意味着它是循环的,例如,对于 ISO 日历,它永远不会超过 24 小时。

示例

iex> Time.add(~T[10:00:00], 27000)
~T[17:30:00]
iex> Time.add(~T[11:00:00.005], 2400)
~T[11:40:00.005]
iex> Time.add(~T[00:00:00.000], 86_399_999, :millisecond)
~T[23:59:59.999]

允许使用负值

iex> Time.add(~T[23:00:00], -60)
~T[22:59:00]

请注意,时间是循环的

iex> Time.add(~T[17:10:05], 86400)
~T[17:10:05]

也支持小时和分钟

iex> Time.add(~T[17:10:05], 2, :hour)
~T[19:10:05]
iex> Time.add(~T[17:10:05], 30, :minute)
~T[17:40:05]

此操作将时间的精度与给定的单位合并

iex> result = Time.add(~T[00:29:10], 21, :millisecond)
~T[00:29:10.021]
iex> result.microsecond
{21000, 3}
链接到此函数

after?(time1, time2)

查看源代码 (自 1.15.0 起)
@spec after?(Calendar.time(), Calendar.time()) :: boolean()

如果第一个时间严格晚于第二个时间,则返回 true

示例

iex> Time.after?(~T[16:04:28], ~T[16:04:16])
true
iex> Time.after?(~T[16:04:16], ~T[16:04:16])
false
iex> Time.after?(~T[16:04:16.001], ~T[16:04:16.01])
false
链接到此函数

before?(time1, time2)

查看源代码 (自 1.15.0 起)
@spec before?(Calendar.time(), Calendar.time()) :: boolean()

如果第一个时间严格早于第二个时间,则返回 true

示例

iex> Time.before?(~T[16:04:16], ~T[16:04:28])
true
iex> Time.before?(~T[16:04:16], ~T[16:04:16])
false
iex> Time.before?(~T[16:04:16.01], ~T[16:04:16.001])
false
链接到此函数

compare(time1, time2)

查看源代码 (自 1.4.0 起)
@spec compare(Calendar.time(), Calendar.time()) :: :lt | :eq | :gt

比较两个时间结构体。

如果第一个时间晚于第二个时间,则返回 :gt,反之亦然返回 :lt。如果两个时间相等,则返回 :eq

示例

iex> Time.compare(~T[16:04:16], ~T[16:04:28])
:lt
iex> Time.compare(~T[16:04:16], ~T[16:04:16])
:eq
iex> Time.compare(~T[16:04:16.01], ~T[16:04:16.001])
:gt

此函数还可以通过仅考虑时间字段来比较更复杂的日历类型

iex> Time.compare(~N[1900-01-01 16:04:16], ~N[2015-01-01 16:04:16])
:eq
iex> Time.compare(~N[2015-01-01 16:04:16], ~N[2015-01-01 16:04:28])
:lt
iex> Time.compare(~N[2015-01-01 16:04:16.01], ~N[2000-01-01 16:04:16.001])
:gt
链接到此函数

convert(time, calendar)

查看源代码 (自 1.5.0 起)
@spec convert(Calendar.time(), Calendar.calendar()) :: {:ok, t()} | {:error, atom()}

将给定的 time 转换为不同的日历。

如果转换成功,则返回 {:ok, time},否则返回 {:error, reason}

示例

假设有人实现了 Calendar.Holocene,这是一个基于公历的日历,它将公历年份增加 10,000 年

iex> Time.convert(~T[13:30:15], Calendar.Holocene)
{:ok, %Time{calendar: Calendar.Holocene, hour: 13, minute: 30, second: 15, microsecond: {0, 0}}}
链接到此函数

convert!(time, calendar)

查看源代码 (自 1.5.0 起)
@spec convert!(Calendar.time(), Calendar.calendar()) :: t()

类似于 Time.convert/2,但如果两个日历之间的转换不可行,则引发 ArgumentError

示例

假设有人实现了 Calendar.Holocene,这是一个基于公历的日历,它将公历年份增加 10,000 年

iex> Time.convert!(~T[13:30:15], Calendar.Holocene)
%Time{calendar: Calendar.Holocene, hour: 13, minute: 30, second: 15, microsecond: {0, 0}}
链接到此函数

diff(time1, time2, unit \\ :second)

查看源代码 (自 1.5.0 起)
@spec diff(Calendar.time(), Calendar.time(), :hour | :minute | System.time_unit()) ::
  integer()

返回两个时间之间的差值,仅考虑小时、分钟、秒和微秒。

compare/2 函数一样,可以使用 Time 结构体和其他包含时间的结构体。例如,如果传递了 NaiveDateTimeDateTime,则只考虑小时、分钟、秒和微秒。在计算差值时,将忽略有关日期或时区的任何附加信息。

答案可以以 :hour:minute:second 或任何来自 System.time_unit/0 的亚秒 unit 返回。如果第一个时间值早于第二个时间值,则返回负数。

单位是根据 Calendar.ISO 测量的,默认值为 :second。不支持分数结果,并将其截断。

示例

iex> Time.diff(~T[00:29:12], ~T[00:29:10])
2

# When passing a `NaiveDateTime` the date part is ignored.
iex> Time.diff(~N[2017-01-01 00:29:12], ~T[00:29:10])
2

# Two `NaiveDateTime` structs could have big differences in the date
# but only the time part is considered.
iex> Time.diff(~N[2017-01-01 00:29:12], ~N[1900-02-03 00:29:10])
2

iex> Time.diff(~T[00:29:12], ~T[00:29:10], :microsecond)
2_000_000
iex> Time.diff(~T[00:29:10], ~T[00:29:12], :microsecond)
-2_000_000

iex> Time.diff(~T[02:29:10], ~T[00:29:10], :hour)
2
iex> Time.diff(~T[02:29:10], ~T[00:29:11], :hour)
1
链接到此函数

from_erl(tuple, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)

查看源代码
@spec from_erl(:calendar.time(), Calendar.microsecond(), Calendar.calendar()) ::
  {:ok, t()} | {:error, atom()}

将 Erlang 时间元组转换为 Time 结构体。

示例

iex> Time.from_erl({23, 30, 15}, {5000, 3})
{:ok, ~T[23:30:15.005]}
iex> Time.from_erl({24, 30, 15})
{:error, :invalid_time}
链接到此函数

from_erl!(tuple, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)

查看源代码
@spec from_erl!(:calendar.time(), Calendar.microsecond(), Calendar.calendar()) :: t()

将 Erlang 时间元组转换为 Time 结构体。

示例

iex> Time.from_erl!({23, 30, 15})
~T[23:30:15]
iex> Time.from_erl!({23, 30, 15}, {5000, 3})
~T[23:30:15.005]
iex> Time.from_erl!({24, 30, 15})
** (ArgumentError) cannot convert {24, 30, 15} to time, reason: :invalid_time
链接到此函数

from_iso8601(string, calendar \\ Calendar.ISO)

查看源代码
@spec from_iso8601(String.t(), Calendar.calendar()) :: {:ok, t()} | {:error, atom()}

解析由 ISO 8601:2019 描述的扩展“本地时间”格式。

字符串中可能包含时区偏移量,但它们将被简单地丢弃,因为时间中不包含此类信息。

如标准中所述,如果需要,可以省略分隔符“T”,因为在此函数中没有歧义。

示例

iex> Time.from_iso8601("23:50:07")
{:ok, ~T[23:50:07]}
iex> Time.from_iso8601("23:50:07Z")
{:ok, ~T[23:50:07]}
iex> Time.from_iso8601("T23:50:07Z")
{:ok, ~T[23:50:07]}

iex> Time.from_iso8601("23:50:07,0123456")
{:ok, ~T[23:50:07.012345]}
iex> Time.from_iso8601("23:50:07.0123456")
{:ok, ~T[23:50:07.012345]}
iex> Time.from_iso8601("23:50:07.123Z")
{:ok, ~T[23:50:07.123]}

iex> Time.from_iso8601("2015:01:23 23-50-07")
{:error, :invalid_format}
iex> Time.from_iso8601("23:50:07A")
{:error, :invalid_format}
iex> Time.from_iso8601("23:50:07.")
{:error, :invalid_format}
iex> Time.from_iso8601("23:50:61")
{:error, :invalid_time}
链接到此函数

from_iso8601!(string, calendar \\ Calendar.ISO)

查看源代码
@spec from_iso8601!(String.t(), Calendar.calendar()) :: t()

解析由 ISO 8601:2019 描述的扩展“本地时间”格式。

如果格式无效,则会引发异常。

示例

iex> Time.from_iso8601!("23:50:07,123Z")
~T[23:50:07.123]
iex> Time.from_iso8601!("23:50:07.123Z")
~T[23:50:07.123]
iex> Time.from_iso8601!("2015:01:23 23-50-07")
** (ArgumentError) cannot parse "2015:01:23 23-50-07" as time, reason: :invalid_format
链接到此函数

from_seconds_after_midnight(seconds, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)

查看源代码 (自 1.11.0 起)
@spec from_seconds_after_midnight(
  integer(),
  Calendar.microsecond(),
  Calendar.calendar()
) :: t()

将午夜后的秒数转换为 Time 结构体。

示例

iex> Time.from_seconds_after_midnight(10_000)
~T[02:46:40]
iex> Time.from_seconds_after_midnight(30_000, {5000, 3})
~T[08:20:00.005]
iex> Time.from_seconds_after_midnight(-1)
~T[23:59:59]
iex> Time.from_seconds_after_midnight(100_000)
~T[03:46:40]
链接到此函数

new(hour, minute, second, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)

查看源代码

构建新的时间。

要求所有值都是整数。如果每个条目都符合其适当的范围,则返回 {:ok, time},否则返回 {:error, reason}

微秒也可以使用精度给出,精度必须是 0 到 6 之间的整数。

内置日历不支持闰秒。

示例

iex> Time.new(0, 0, 0, 0)
{:ok, ~T[00:00:00.000000]}
iex> Time.new(23, 59, 59, 999_999)
{:ok, ~T[23:59:59.999999]}

iex> Time.new(24, 59, 59, 999_999)
{:error, :invalid_time}
iex> Time.new(23, 60, 59, 999_999)
{:error, :invalid_time}
iex> Time.new(23, 59, 60, 999_999)
{:error, :invalid_time}
iex> Time.new(23, 59, 59, 1_000_000)
{:error, :invalid_time}

# Invalid precision
Time.new(23, 59, 59, {999_999, 10})
{:error, :invalid_time}
链接到此函数

new!(hour, minute, second, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)

查看源代码 (自 1.11.0 起)

构建新的时间。

要求所有值都是整数。如果每个条目都符合其适当的范围,则返回 time,如果时间无效,则引发异常。

微秒也可以使用精度给出,精度必须是 0 到 6 之间的整数。

内置日历不支持闰秒。

示例

iex> Time.new!(0, 0, 0, 0)
~T[00:00:00.000000]
iex> Time.new!(23, 59, 59, 999_999)
~T[23:59:59.999999]
iex> Time.new!(24, 59, 59, 999_999)
** (ArgumentError) cannot build time, reason: :invalid_time
@spec to_erl(Calendar.time()) :: :calendar.time()

将给定的 time 转换为 Erlang 时间元组。

警告:可能会发生精度损失,因为 Erlang 时间元组只包含小时/分钟/秒。

示例

iex> Time.to_erl(~T[23:30:15.999])
{23, 30, 15}

iex> Time.to_erl(~N[2010-04-17 23:30:15.999])
{23, 30, 15}
链接到此函数

to_iso8601(time, format \\ :extended)

查看源代码
@spec to_iso8601(Calendar.time(), :extended | :basic) :: String.t()

将给定的时间转换为 ISO 8601:2019

默认情况下,Time.to_iso8601/2 以“扩展”格式返回时间,以便于人类阅读。它还支持通过传递 :basic 选项的“基本”格式。

示例

iex> Time.to_iso8601(~T[23:00:13])
"23:00:13"

iex> Time.to_iso8601(~T[23:00:13.001])
"23:00:13.001"

iex> Time.to_iso8601(~T[23:00:13.001], :basic)
"230013.001"

iex> Time.to_iso8601(~N[2010-04-17 23:00:13])
"23:00:13"
链接到此函数

to_seconds_after_midnight(time)

查看源代码 (自 1.11.0 起)
@spec to_seconds_after_midnight(Calendar.time()) :: {integer(), non_neg_integer()}

Time 结构体转换为午夜后的秒数。

返回值是一个包含秒数和微秒数的二元元组。

示例

iex> Time.to_seconds_after_midnight(~T[23:30:15])
{84615, 0}
iex> Time.to_seconds_after_midnight(~N[2010-04-17 23:30:15.999])
{84615, 999000}
@spec to_string(Calendar.time()) :: String.t()

将给定的 time 转换为字符串。

示例

iex> Time.to_string(~T[23:00:00])
"23:00:00"
iex> Time.to_string(~T[23:00:00.001])
"23:00:00.001"
iex> Time.to_string(~T[23:00:00.123456])
"23:00:00.123456"

iex> Time.to_string(~N[2015-01-01 23:00:00.001])
"23:00:00.001"
iex> Time.to_string(~N[2015-01-01 23:00:00.123456])
"23:00:00.123456"
链接到此函数

truncate(time, precision)

查看源代码 (自 1.6.0 起)
@spec truncate(t(), :microsecond | :millisecond | :second) :: t()

返回给定的时间,其中微秒字段被截断到给定的精度(:microsecondmillisecond:second)。

如果给定时间本身的精度低于给定的精度,则返回该时间本身。

示例

iex> Time.truncate(~T[01:01:01.123456], :microsecond)
~T[01:01:01.123456]

iex> Time.truncate(~T[01:01:01.123456], :millisecond)
~T[01:01:01.123]

iex> Time.truncate(~T[01:01:01.123456], :second)
~T[01:01:01]
链接到此函数

utc_now(calendar \\ Calendar.ISO)

查看源代码 (自 1.4.0 起)
@spec utc_now(Calendar.calendar()) :: t()

返回 UTC 中的当前时间。

示例

iex> time = Time.utc_now()
iex> time.hour >= 0
true