檢視原始碼 時間 (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}

此模組上的函式會使用 時間 結構,以及包含與 時間 結構相同欄位的任何結構,例如 NaiveDateTimeDateTime。此類函式會在類型規格中預期 Calendar.time/0 (而非 t/0)。

開發人員應避免直接建立時間結構,而應依賴此模組提供的函式,以及第三方日曆函式庫中的函式。

比較時間

使用 ==/2>/2</2 等符號在 Elixir 中進行比較時,會根據結構和 時間 結構欄位進行比較。若要正確比較時間,請使用 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]

摘要

函式

amount_to_addunit 加入指定的 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()

amount_to_addunit 加入指定的 time

接受任何 unit 中的 amount_to_addunit 可以是 :hour:minute:secondSystem.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 或任何子秒 unit,這些單位可從 System.time_unit/0 取得。如果第一個時間值早於第二個時間值,則傳回負數。

單位根據 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 起)

建立新的時間。

預期所有值都是整數。如果每個條目都符合其適當的範圍,則傳回 時間,如果時間無效,則會引發錯誤。

微秒也可以用精度表示,精度必須是 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