當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir DateTime用法及代碼示例


Elixir語言中 DateTime 相關用法介紹如下。

具有時區的日期時間實現。

此日期時間可以看作是給定時區的日期和時間的快照。為此,它還包括 UTC 和標準偏移量,以及專門用於格式化目的的區域縮寫字段。請注意,不一定保證未來的日期時間存在,因為由於地緣政治原因,時區可能會在未來的任何時間發生變化。有關詳細信息,請參閱“作為快照的日期時間”部分。

請記住,在 Elixir 中使用 ==/2 >/2 </2 和朋友的比較是結構化的,並且基於 DateTime 結構字段。要正確比較日期時間,請使用 compare/2 函數。

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

時區數據庫

此模塊中的許多函數都需要時區數據庫。默認情況下,它使用 Calendar.get_time_zone_database/0 返回的默認時區數據庫,默認為 Calendar.UTCOnlyTimeZoneDatabase 僅處理 "Etc/UTC" 日期時間並為任何其他時區返回 {:error, :utc_only_time_zone_database}

也可以配置其他時區數據庫。例如,兩個可用選項是:

要使用它們,首先確保將其作為依賴項添加到 mix.exs 中。然後可以通過配置進行配置:

config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase

或通過調用 Calendar.put_time_zone_database/1

Calendar.put_time_zone_database(Tzdata.TimeZoneDatabase)

請參閱庫安裝說明中的正確名稱。

日期時間作為快照

在第一節中,我們將日期時間說明為“給定時區的日期和時間的快照”。為了準確理解我們的意思,讓我們看一個例子。

想象一下,波蘭的某個人想安排明年與巴西的某個人會麵。會議將在波蘭時區的淩晨 2:30 舉行。會議將在什麽時候在巴西舉行?

您可以在一年前的今天使用本模塊中的 API 查詢時區數據庫,它會為您提供當前有效的答案。但是,這個答案將來可能無效。為什麽?因為巴西和波蘭都可能改變他們的時區規則,最終影響結果。例如,一個國家可能會選擇進入或放棄“夏令時”,這是我們每年將時鍾向前一小時或向後一小時調整一次的過程。當規則改變時,波蘭時間淩晨 2 點 30 分在巴西的確切時間可能會改變。

換句話說,無論何時使用未來的 DateTime,都無法保證您獲得的結果將始終正確,直到事件實際發生。因此,當您詢問未來時間時,您得到的答案是反映時區規則當前狀態的快照。對於過去的日期時間,這不是問題,因為時區規則不會因過去的事件而改變。

更糟糕的是,波蘭時間的淩晨 2:30 可能實際上根本不存在,或者它是模棱兩可的。如果某個時區遵守“夏令時”,他們將每年將時鍾向前移動一次。當這種情況發生時,有一整小時是不存在的。然後,當他們將時鍾往回移動時,有一個特定的時間會發生兩次。因此,如果您想在這種轉變發生時安排會議,您需要明確說明您的確切意思是淩晨 2:30 中的哪一個。對日期和時間敏感的應用程序需要考慮這些場景並將它們正確地傳達給用戶。

好消息是:Elixir 包含解決這些問題所需的所有構建塊。 Elixir 使用的默認時區數據庫 Calendar.UTCOnlyTimeZoneDatabase 僅適用於 UTC,它不會觀察到這些問題。一旦你帶了合適的時區數據庫,這個模塊中的函數就會查詢數據庫並返回相關信息。例如,查看 DateTime.new/4 如何根據本節說明的場景返回不同的結果。

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 DateTime。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。