檢視原始碼 NaiveDateTime (Elixir v1.16.2)

一個 NaiveDateTime 結構(沒有時區)和函式。

NaiveDateTime 結構包含欄位 year、month、day、hour、minute、second、microsecond 和 calendar。可以使用 new/2new/8 函式或使用 ~N(請參閱 sigil_N/2)符號建立新的簡化日期時間

iex> ~N[2000-01-01 23:00:07]
~N[2000-01-01 23:00:07]

結構中的日期和時間欄位可以直接存取

iex> naive = ~N[2000-01-01 23:00:07]
iex> naive.year
2000
iex> naive.second
7

我們稱它們為「簡化」,因為此日期時間表示沒有時區。這表示即使日期時間有效,在世界上某些地區可能實際上不存在。

例如,當某個地區套用夏令時間時,時鐘通常會前進或後退一小時。這表示某些日期時間永遠不會發生或可能發生多次。由於 NaiveDateTime 沒有根據時區驗證,因此此類錯誤將不會被發現。

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

比較簡化日期時間

使用 ==/2>/2</2 等在 Elixir 中進行比較是結構性的,且根據 NaiveDateTime 結構欄位進行。若要正確比較簡化日期時間,請使用 compare/2 函式。此模組中 compare/2 函式的存在也允許使用 Enum.min/2Enum.max/2 函式取得 Enum 的最小和最大簡化日期時間。例如

iex> Enum.min([~N[2020-01-01 23:00:07], ~N[2000-01-01 23:00:07]], NaiveDateTime)
~N[2000-01-01 23:00:07]

使用紀元

函數 add/3diff/3 可用於計算日期時間或擷取瞬間之間的秒數。例如,若有興趣計算從 Unix 紀元(1970-01-01 00:00:00)開始的秒數

iex> NaiveDateTime.diff(~N[2010-04-17 14:00:00], ~N[1970-01-01 00:00:00])
1271512800

iex> NaiveDateTime.add(~N[1970-01-01 00:00:00], 1_271_512_800)
~N[2010-04-17 14:00:00]

這些函數經過最佳化,可處理常見的紀元,例如上述的 Unix 紀元或格里曆紀元(0000-01-01 00:00:00)。

摘要

函數

如果第一個 NaiveDateTime 嚴格晚於第二個,則傳回 true

如果第一個 NaiveDateTime 嚴格早於第二個,則傳回 true

計算一個 NaiveDateTime,作為給定 NaiveDateTime 的第一個時刻。

將給定的 naive_datetime 從一個日曆轉換到另一個日曆。

將給定的 naive_datetime 從一個日曆轉換到另一個日曆。

naive_datetime1 中減去 naive_datetime2

計算一個 NaiveDateTime,作為給定 NaiveDateTime 的最後一個時刻。

將一個 Erlang datetime tuple 轉換為 NaiveDateTime 結構。

將一個 Erlang datetime tuple 轉換為 NaiveDateTime 結構。

解析 ISO 8601:2019 所描述的「日期和時間」擴充格式。

解析 ISO 8601:2019 所描述的「日期和時間」擴充格式。

傳回 Elixir 程式執行機器上的「當地時間」。

根據日期和時間結構建立一個天真的日期時間。

根據日期和時間結構建立一個天真的日期時間。

NaiveDateTime 轉換成 Date

NaiveDateTime 結構轉換成 Erlang 日期時間元組。

NaiveDateTime 結構轉換成格里曆秒數和微秒數。

將指定的無時區日期時間轉換成 ISO 8601:2019

根據其日曆將指定的無時區日期時間轉換成字串。

NaiveDateTime 轉換成 Time

傳回指定的無時區日期時間,微秒欄位已截斷至指定的精度(:microsecond:millisecond:second)。

傳回 UTC 中目前的無時區日期時間。

傳回 UTC 中目前的無時區日期時間,支援特定日曆和精度。

類型

@type t() :: %NaiveDateTime{
  calendar: Calendar.calendar(),
  day: Calendar.day(),
  hour: Calendar.hour(),
  microsecond: Calendar.microsecond(),
  minute: Calendar.minute(),
  month: Calendar.month(),
  second: Calendar.second(),
  year: Calendar.year()
}

函式

連結到此函式

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

檢視原始碼 (自 1.4.0 起)
@spec add(
  Calendar.naive_datetime(),
  integer(),
  :day | :hour | :minute | System.time_unit()
) :: t()

將指定的時間量新增到 NaiveDateTime

接受任何 unit 中的 amount_to_addunit 可以是 :day:hour:minute:secondSystem.time_unit/0 中的任何次秒精度。預設為 :second。負值會在時間中往後移動。

此函數總是會考慮根據 Calendar.ISO 計算的單位。

範例

預設使用秒

# adds seconds by default
iex> NaiveDateTime.add(~N[2014-10-02 00:29:10], 2)
~N[2014-10-02 00:29:12]

# accepts negative offsets
iex> NaiveDateTime.add(~N[2014-10-02 00:29:10], -2)
~N[2014-10-02 00:29:08]

它也可以使用亞秒精度

iex> NaiveDateTime.add(~N[2014-10-02 00:29:10], 2_000, :millisecond)
~N[2014-10-02 00:29:12.000]

以及天/小時/分鐘

iex> NaiveDateTime.add(~N[2015-02-28 00:29:10], 2, :day)
~N[2015-03-02 00:29:10]
iex> NaiveDateTime.add(~N[2015-02-28 00:29:10], 36, :hour)
~N[2015-03-01 12:29:10]
iex> NaiveDateTime.add(~N[2015-02-28 00:29:10], 60, :minute)
~N[2015-02-28 01:29:10]

此操作會將純粹日期時間的精度與給定的單位合併

iex> result = NaiveDateTime.add(~N[2014-10-02 00:29:10], 21, :millisecond)
~N[2014-10-02 00:29:10.021]
iex> result.microsecond
{21000, 3}

針對格里曆秒數或 Unix 紀元進行的運算已最佳化

# from Gregorian seconds
iex> NaiveDateTime.add(~N[0000-01-01 00:00:00], 63_579_428_950)
~N[2014-10-02 00:29:10]

傳遞 DateTime 會自動將其轉換為 NaiveDateTime,捨棄時區資訊

iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> NaiveDateTime.add(dt, 21, :second)
~N[2000-02-29 23:00:28]
連結到此函式

after?(naive_datetime1, naive_datetime2)

檢視原始碼 (自 1.15.0 起)

如果第一個 NaiveDateTime 嚴格晚於第二個,則傳回 true

範例

iex> NaiveDateTime.after?(~N[2022-02-02 11:00:00], ~N[2021-01-01 11:00:00])
true
iex> NaiveDateTime.after?(~N[2021-01-01 11:00:00], ~N[2021-01-01 11:00:00])
false
iex> NaiveDateTime.after?(~N[2021-01-01 11:00:00], ~N[2022-02-02 11:00:00])
false
連結到此函式

before?(naive_datetime1, naive_datetime2)

檢視原始碼 (自 1.15.0 起)

如果第一個 NaiveDateTime 嚴格早於第二個,則傳回 true

範例

iex> NaiveDateTime.before?(~N[2021-01-01 11:00:00], ~N[2022-02-02 11:00:00])
true
iex> NaiveDateTime.before?(~N[2021-01-01 11:00:00], ~N[2021-01-01 11:00:00])
false
iex> NaiveDateTime.before?(~N[2022-02-02 11:00:00], ~N[2021-01-01 11:00:00])
false
連結到此函式

beginning_of_day(naive_datetime)

檢視原始碼 (自 1.15.0 起)
@spec beginning_of_day(Calendar.naive_datetime()) :: t()

計算一個 NaiveDateTime,作為給定 NaiveDateTime 的第一個時刻。

若要計算 DateTime 的一天開始,請呼叫此函數,然後轉換回 DateTime

datetime
|> NaiveDateTime.beginning_of_day()
|> DateTime.from_naive(datetime.time_zone)

請注意,一天的開始在給定的時區中可能不存在或不明確,因此您必須適當地處理這些情況。

範例

iex> NaiveDateTime.beginning_of_day(~N[2000-01-01 23:00:07.123456])
~N[2000-01-01 00:00:00.000000]
連結到此函式

compare(naive_datetime1, naive_datetime2)

檢視原始碼 (自 1.4.0 起)
@spec compare(Calendar.naive_datetime(), Calendar.naive_datetime()) :: :lt | :eq | :gt

比較兩個 NaiveDateTime 結構。

如果 first 晚於 second,則傳回 :gt,反之則傳回 :lt。如果兩個 NaiveDateTime 相等,則傳回 :eq

範例

iex> NaiveDateTime.compare(~N[2016-04-16 13:30:15], ~N[2016-04-28 16:19:25])
:lt
iex> NaiveDateTime.compare(~N[2016-04-16 13:30:15.1], ~N[2016-04-16 13:30:15.01])
:gt

此函數也可拿來比較沒有時區資訊的 DateTime

iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> NaiveDateTime.compare(dt, ~N[2000-02-29 23:00:07])
:eq
iex> NaiveDateTime.compare(dt, ~N[2000-01-29 23:00:07])
:gt
iex> NaiveDateTime.compare(dt, ~N[2000-03-29 23:00:07])
:lt
連結到此函式

convert(naive_datetime, calendar)

檢視原始碼 (自 1.5.0 起)
@spec convert(Calendar.naive_datetime(), Calendar.calendar()) ::
  {:ok, t()} | {:error, :incompatible_calendars}

將給定的 naive_datetime 從一個日曆轉換到另一個日曆。

如果無法在日曆之間明確轉換(請參閱 Calendar.compatible_calendars?/2),則會傳回 {:error, :incompatible_calendars} 元組。

範例

想像一下有人實作 Calendar.Holocene,這是一個基於格里曆的日曆,會在目前的格里曆年份中精確地加上 10,000 年

iex> NaiveDateTime.convert(~N[2000-01-01 13:30:15], Calendar.Holocene)
{:ok, %NaiveDateTime{calendar: Calendar.Holocene, year: 12000, month: 1, day: 1,
                     hour: 13, minute: 30, second: 15, microsecond: {0, 0}}}
連結到此函式

convert!(naive_datetime, calendar)

檢視原始碼 (自 1.5.0 起)
@spec convert!(Calendar.naive_datetime(), Calendar.calendar()) :: t()

將給定的 naive_datetime 從一個日曆轉換到另一個日曆。

如果無法在日曆之間進行明確轉換(請參閱 Calendar.compatible_calendars?/2),則會引發 ArgumentError。

範例

想像一下有人實作 Calendar.Holocene,這是一個基於格里曆的日曆,會在目前的格里曆年份中精確地加上 10,000 年

iex> NaiveDateTime.convert!(~N[2000-01-01 13:30:15], Calendar.Holocene)
%NaiveDateTime{calendar: Calendar.Holocene, year: 12000, month: 1, day: 1,
               hour: 13, minute: 30, second: 15, microsecond: {0, 0}}
連結到此函式

diff(naive_datetime1, naive_datetime2, unit \\ :second)

檢視原始碼 (自 1.4.0 起)
@spec diff(
  Calendar.naive_datetime(),
  Calendar.naive_datetime(),
  :day | :hour | :minute | System.time_unit()
) :: integer()

naive_datetime1 中減去 naive_datetime2

答案可以在任何 :day:hour:minuteSystem.time_unit/0 中取得的任何 unit 中回傳。單位是根據 Calendar.ISO 測量,預設為 :second

不支援小數結果,且會進行截斷。

範例

iex> NaiveDateTime.diff(~N[2014-10-02 00:29:12], ~N[2014-10-02 00:29:10])
2
iex> NaiveDateTime.diff(~N[2014-10-02 00:29:12], ~N[2014-10-02 00:29:10], :microsecond)
2_000_000

iex> NaiveDateTime.diff(~N[2014-10-02 00:29:10.042], ~N[2014-10-02 00:29:10.021])
0
iex> NaiveDateTime.diff(~N[2014-10-02 00:29:10.042], ~N[2014-10-02 00:29:10.021], :millisecond)
21

iex> NaiveDateTime.diff(~N[2014-10-02 00:29:10], ~N[2014-10-02 00:29:12])
-2
iex> NaiveDateTime.diff(~N[-0001-10-02 00:29:10], ~N[-0001-10-02 00:29:12])
-2

它也可以計算日、時或分的差異

iex> NaiveDateTime.diff(~N[2014-10-10 00:29:10], ~N[2014-10-02 00:29:10], :day)
8
iex> NaiveDateTime.diff(~N[2014-10-02 12:29:10], ~N[2014-10-02 00:29:10], :hour)
12
iex> NaiveDateTime.diff(~N[2014-10-02 00:39:10], ~N[2014-10-02 00:29:10], :minute)
10

但它也會將未完成的天數四捨五入為零

iex> NaiveDateTime.diff(~N[2014-10-10 00:29:09], ~N[2014-10-02 00:29:10], :day)
7
連結到此函式

end_of_day(naive_datetime)

檢視原始碼 (自 1.15.0 起)
@spec end_of_day(Calendar.naive_datetime()) :: t()

計算一個 NaiveDateTime,作為給定 NaiveDateTime 的最後一個時刻。

若要計算 DateTime 的一天結束,請呼叫此函式,然後轉換回 DateTime

datetime
|> NaiveDateTime.end_of_day()
|> DateTime.from_naive(datetime.time_zone)

請注意,在給定的時區中,一天的結束可能不存在或不明確,因此您必須適當地處理這些情況。

範例

iex> NaiveDateTime.end_of_day(~N[2000-01-01 23:00:07.123456])
~N[2000-01-01 23:59:59.999999]
連結到此函式

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

檢視原始碼
@spec from_erl(:calendar.datetime(), Calendar.microsecond(), Calendar.calendar()) ::
  {:ok, t()} | {:error, atom()}

將一個 Erlang datetime tuple 轉換為 NaiveDateTime 結構。

嘗試轉換無效的 ISO 日曆日期會產生錯誤組。

範例

iex> NaiveDateTime.from_erl({{2000, 1, 1}, {13, 30, 15}})
{:ok, ~N[2000-01-01 13:30:15]}
iex> NaiveDateTime.from_erl({{2000, 1, 1}, {13, 30, 15}}, {5000, 3})
{:ok, ~N[2000-01-01 13:30:15.005]}
iex> NaiveDateTime.from_erl({{2000, 13, 1}, {13, 30, 15}})
{:error, :invalid_date}
iex> NaiveDateTime.from_erl({{2000, 13, 1}, {13, 30, 15}})
{:error, :invalid_date}
連結到此函式

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

檢視原始碼

將一個 Erlang datetime tuple 轉換為 NaiveDateTime 結構。

如果日期時間無效,則會引發錯誤。嘗試轉換無效的 ISO 日曆日期會產生錯誤組。

範例

iex> NaiveDateTime.from_erl!({{2000, 1, 1}, {13, 30, 15}})
~N[2000-01-01 13:30:15]
iex> NaiveDateTime.from_erl!({{2000, 1, 1}, {13, 30, 15}}, {5000, 3})
~N[2000-01-01 13:30:15.005]
iex> NaiveDateTime.from_erl!({{2000, 13, 1}, {13, 30, 15}})
** (ArgumentError) cannot convert {{2000, 13, 1}, {13, 30, 15}} to naive datetime, reason: :invalid_date
連結到此函式

from_gregorian_seconds(seconds, arg \\ {0, 0}, calendar \\ Calendar.ISO)

檢視原始碼 (自 1.11.0 起)
@spec from_gregorian_seconds(integer(), Calendar.microsecond(), Calendar.calendar()) ::
  t()

將格里曆秒數轉換為 NaiveDateTime 結構。

範例

iex> NaiveDateTime.from_gregorian_seconds(1)
~N[0000-01-01 00:00:01]
iex> NaiveDateTime.from_gregorian_seconds(63_755_511_991, {5000, 3})
~N[2020-05-01 00:26:31.005]
iex> NaiveDateTime.from_gregorian_seconds(-1)
~N[-0001-12-31 23:59:59]
連結到此函式

from_iso8601(string, calendar \\ Calendar.ISO)

檢視原始碼
@spec from_iso8601(String.t(), Calendar.calendar()) :: {:ok, t()} | {:error, atom()}

解析 ISO 8601:2019 所描述的「日期和時間」擴充格式。

時區偏移量可以包含在字串中,但它們只會被捨棄,因為此類資訊未包含在簡潔日期時間中。

如標準中所述,如果需要,可以省略分隔符號「T」,因為此函式中沒有歧義。

請注意,內建的 Calendar.ISO 不支援閏秒。

範例

iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07")
{:ok, ~N[2015-01-23 23:50:07]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07")
{:ok, ~N[2015-01-23 23:50:07]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07Z")
{:ok, ~N[2015-01-23 23:50:07]}

iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07.0")
{:ok, ~N[2015-01-23 23:50:07.0]}
iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07,0123456")
{:ok, ~N[2015-01-23 23:50:07.012345]}
iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07.0123456")
{:ok, ~N[2015-01-23 23:50:07.012345]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123Z")
{:ok, ~N[2015-01-23 23:50:07.123]}

iex> NaiveDateTime.from_iso8601("2015-01-23P23:50:07")
{:error, :invalid_format}
iex> NaiveDateTime.from_iso8601("2015:01:23 23-50-07")
{:error, :invalid_format}
iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07A")
{:error, :invalid_format}
iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:61")
{:error, :invalid_time}
iex> NaiveDateTime.from_iso8601("2015-01-32 23:50:07")
{:error, :invalid_date}

iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123+02:30")
{:ok, ~N[2015-01-23 23:50:07.123]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123+00:00")
{:ok, ~N[2015-01-23 23:50:07.123]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123-02:30")
{:ok, ~N[2015-01-23 23:50:07.123]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123-00:00")
{:error, :invalid_format}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123-00:60")
{:error, :invalid_format}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123-24:00")
{:error, :invalid_format}
連結到此函式

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

檢視原始碼
@spec from_iso8601!(String.t(), Calendar.calendar()) :: t()

解析 ISO 8601:2019 所描述的「日期和時間」擴充格式。

如果格式無效,則會引發錯誤。

範例

iex> NaiveDateTime.from_iso8601!("2015-01-23T23:50:07.123Z")
~N[2015-01-23 23:50:07.123]
iex> NaiveDateTime.from_iso8601!("2015-01-23T23:50:07,123Z")
~N[2015-01-23 23:50:07.123]
iex> NaiveDateTime.from_iso8601!("2015-01-23P23:50:07")
** (ArgumentError) cannot parse "2015-01-23P23:50:07" as naive datetime, reason: :invalid_format
連結到此函式

local_now(calendar \\ Calendar.ISO)

檢視原始碼 (自 1.10.0 起)
@spec local_now(Calendar.calendar()) :: t()

傳回 Elixir 程式執行機器上的「當地時間」。

警告:此函式可能會造成隱藏的錯誤。它會根據執行時間的時區設定而定。這可能會變更,並設定為有夏令時間跳躍(春季前進或秋季後退)的時區。

此函式可用於顯示機器目前的時區設定時間。範例是桌面程式會顯示時鐘給使用者。對於任何其他用途,使用此函式可能不是個好主意。

對於大多數情況,請改用 DateTime.now/2DateTime.utc_now/1

不包含小數秒數。

範例

iex> naive_datetime = NaiveDateTime.local_now()
iex> naive_datetime.year >= 2019
true
@spec new(Date.t(), Time.t()) :: {:ok, t()}

根據日期和時間結構建立一個天真的日期時間。

範例

iex> NaiveDateTime.new(~D[2010-01-13], ~T[23:00:07.005])
{:ok, ~N[2010-01-13 23:00:07.005]}
連結到此函式

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

檢視原始碼

建立一個新的 ISO 天真日期時間。

預期所有值都是整數。如果每個輸入都符合適當的範圍,則傳回 {:ok, naive_datetime};否則傳回 {:error, reason}

範例

iex> NaiveDateTime.new(2000, 1, 1, 0, 0, 0)
{:ok, ~N[2000-01-01 00:00:00]}
iex> NaiveDateTime.new(2000, 13, 1, 0, 0, 0)
{:error, :invalid_date}
iex> NaiveDateTime.new(2000, 2, 29, 0, 0, 0)
{:ok, ~N[2000-02-29 00:00:00]}
iex> NaiveDateTime.new(2000, 2, 30, 0, 0, 0)
{:error, :invalid_date}
iex> NaiveDateTime.new(2001, 2, 29, 0, 0, 0)
{:error, :invalid_date}

iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 59, {0, 1})
{:ok, ~N[2000-01-01 23:59:59.0]}
iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 59, 999_999)
{:ok, ~N[2000-01-01 23:59:59.999999]}
iex> NaiveDateTime.new(2000, 1, 1, 24, 59, 59, 999_999)
{:error, :invalid_time}
iex> NaiveDateTime.new(2000, 1, 1, 23, 60, 59, 999_999)
{:error, :invalid_time}
iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 60, 999_999)
{:error, :invalid_time}
iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 59, 1_000_000)
{:error, :invalid_time}

iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 59, {0, 1}, Calendar.ISO)
{:ok, ~N[2000-01-01 23:59:59.0]}
連結到此函式

new!(date, time)

檢視原始碼 (自 1.11.0 起)
@spec new!(Date.t(), Time.t()) :: t()

根據日期和時間結構建立一個天真的日期時間。

範例

iex> NaiveDateTime.new!(~D[2010-01-13], ~T[23:00:07.005])
~N[2010-01-13 23:00:07.005]
連結到此函式

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

檢視原始碼 (自 1.11.0 起)

建立一個新的 ISO 天真日期時間。

預期所有值都是整數。如果每個輸入都符合適當的範圍,則傳回 naive_datetime;如果時間或日期無效,則會引發例外。

範例

iex> NaiveDateTime.new!(2000, 1, 1, 0, 0, 0)
~N[2000-01-01 00:00:00]
iex> NaiveDateTime.new!(2000, 2, 29, 0, 0, 0)
~N[2000-02-29 00:00:00]
iex> NaiveDateTime.new!(2000, 1, 1, 23, 59, 59, {0, 1})
~N[2000-01-01 23:59:59.0]
iex> NaiveDateTime.new!(2000, 1, 1, 23, 59, 59, 999_999)
~N[2000-01-01 23:59:59.999999]
iex> NaiveDateTime.new!(2000, 1, 1, 23, 59, 59, {0, 1}, Calendar.ISO)
~N[2000-01-01 23:59:59.0]
iex> NaiveDateTime.new!(2000, 1, 1, 24, 59, 59, 999_999)
** (ArgumentError) cannot build naive datetime, reason: :invalid_time
@spec to_date(Calendar.naive_datetime()) :: Date.t()

NaiveDateTime 轉換成 Date

由於 Date 不包含時間資訊,因此在轉換過程中資料會遺失。

範例

iex> NaiveDateTime.to_date(~N[2002-01-13 23:00:07])
~D[2002-01-13]

NaiveDateTime 結構轉換成 Erlang 日期時間元組。

僅支援轉換 ISO 日曆中的樸素日期時間,嘗試轉換其他日曆中的樸素日期時間會引發例外。

警告:可能會發生精確度損失,因為 Erlang 時間元組只儲存小時/分鐘/秒。

範例

iex> NaiveDateTime.to_erl(~N[2000-01-01 13:30:15])
{{2000, 1, 1}, {13, 30, 15}}

此函式也可轉換 DateTime 為不含時區資訊的 Erlang datetime tuple

iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> NaiveDateTime.to_erl(dt)
{{2000, 2, 29}, {23, 00, 07}}
連結到此函式

to_gregorian_seconds(map)

檢視原始碼 (自 1.11.0 起)
@spec to_gregorian_seconds(Calendar.naive_datetime()) ::
  {integer(), non_neg_integer()}

NaiveDateTime 結構轉換成格里曆秒數和微秒數。

範例

iex> NaiveDateTime.to_gregorian_seconds(~N[0000-01-01 00:00:01])
{1, 0}
iex> NaiveDateTime.to_gregorian_seconds(~N[2020-05-01 00:26:31.005])
{63_755_511_991, 5000}
連結到此函式

to_iso8601(naive_datetime, format \\ :extended)

檢視原始碼
@spec to_iso8601(Calendar.naive_datetime(), :basic | :extended) :: String.t()

將指定的無時區日期時間轉換成 ISO 8601:2019

預設情況下,NaiveDateTime.to_iso8601/2 傳回格式化為「延伸」格式的樸素日期時間,以供人類閱讀。它也支援透過傳遞 :basic 選項來使用「基本」格式。

僅支援轉換 ISO 日曆中的樸素日期時間,嘗試轉換其他日曆中的樸素日期時間會引發例外。

範例

iex> NaiveDateTime.to_iso8601(~N[2000-02-28 23:00:13])
"2000-02-28T23:00:13"

iex> NaiveDateTime.to_iso8601(~N[2000-02-28 23:00:13.001])
"2000-02-28T23:00:13.001"

iex> NaiveDateTime.to_iso8601(~N[2000-02-28 23:00:13.001], :basic)
"20000228T230013.001"

此函式也可轉換 DateTime 為不含時區資訊的 ISO 8601

iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> NaiveDateTime.to_iso8601(dt)
"2000-02-29T23:00:07"
連結到此函式

to_string(naive_datetime)

檢視原始碼
@spec to_string(Calendar.naive_datetime()) :: String.t()

根據其日曆將指定的無時區日期時間轉換成字串。

範例

iex> NaiveDateTime.to_string(~N[2000-02-28 23:00:13])
"2000-02-28 23:00:13"
iex> NaiveDateTime.to_string(~N[2000-02-28 23:00:13.001])
"2000-02-28 23:00:13.001"
iex> NaiveDateTime.to_string(~N[-0100-12-15 03:20:31])
"-0100-12-15 03:20:31"

此函式也可轉換 DateTime 為不含時區資訊的字串

iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> NaiveDateTime.to_string(dt)
"2000-02-29 23:00:07"
@spec to_time(Calendar.naive_datetime()) :: Time.t()

NaiveDateTime 轉換成 Time

由於 Time 不包含日期資訊,資料會在轉換過程中遺失。

範例

iex> NaiveDateTime.to_time(~N[2002-01-13 23:00:07])
~T[23:00:07]
連結到此函式

truncate(naive_datetime, precision)

檢視原始碼 (自 1.6.0 起)
@spec truncate(t(), :microsecond | :millisecond | :second) :: t()

傳回指定的無時區日期時間,微秒欄位已截斷至指定的精度(:microsecond:millisecond:second)。

如果樸素日期時間的精度已低於指定的精度,則傳回未變更的樸素日期時間。

範例

iex> NaiveDateTime.truncate(~N[2017-11-06 00:23:51.123456], :microsecond)
~N[2017-11-06 00:23:51.123456]

iex> NaiveDateTime.truncate(~N[2017-11-06 00:23:51.123456], :millisecond)
~N[2017-11-06 00:23:51.123]

iex> NaiveDateTime.truncate(~N[2017-11-06 00:23:51.123456], :second)
~N[2017-11-06 00:23:51]
連結到此函式

utc_now(calendar_or_time_unit \\ Calendar.ISO)

檢視原始碼 (自 1.4.0 起)
@spec utc_now(Calendar.calendar() | :native | :microsecond | :millisecond | :second) ::
  t()

傳回 UTC 中目前的無時區日期時間。

如果可以,建議使用 DateTime.utc_now/0,因為與 NaiveDateTime 相反,它會保留時區資訊。

您也可以提供時間單位來自動截斷樸素日期時間。此功能自 v1.15.0 起提供。

範例

iex> naive_datetime = NaiveDateTime.utc_now()
iex> naive_datetime.year >= 2016
true

iex> naive_datetime = NaiveDateTime.utc_now(:second)
iex> naive_datetime.microsecond
{0, 0}
連結到此函式

utc_now(time_unit, calendar)

檢視原始碼 (自 1.15.0 起)
@spec utc_now(:native | :microsecond | :millisecond | :second, Calendar.calendar()) ::
  t()

傳回 UTC 中目前的無時區日期時間,支援特定日曆和精度。

盡可能優先使用 DateTime.utc_now/2,因為與 NaiveDateTime 相反,它會保留時區資訊。

範例

iex> naive_datetime = NaiveDateTime.utc_now(:second, Calendar.ISO)
iex> naive_datetime.year >= 2016
true

iex> naive_datetime = NaiveDateTime.utc_now(:second, Calendar.ISO)
iex> naive_datetime.microsecond
{0, 0}