檢視原始碼 calendar (stdlib v6.2)

本地和世界時間、星期幾、日期和時間轉換。

這個模組提供了本地和世界時間的計算、星期幾的計算,以及許多時間轉換函數。

當時間根據當前時區和日光節約時間調整時,時間是本地時間。當時間反映經度零的時間,且未針對日光節約時間進行任何調整時,時間是世界時間。世界協調時間 (UTC) 也稱為格林威治標準時間 (GMT)。

此模組中的時間函數 local_time/0universal_time/0 都會回傳日期和時間。這是因為獨立的日期和時間函數可能會產生相差 24 小時的日期/時間組合。如果其中一個函數在午夜之前呼叫,而另一個函數在午夜之後呼叫,就會發生這種情況。這個問題也適用於 Erlang BIFs date/0time/0,如果需要可靠的日期/時間戳記,強烈建議不要使用它們。

所有日期都符合格里曆。這個曆法由教宗格列高利十三世於 1582 年引入,並從這一年起在所有天主教國家使用。德國和荷蘭的新教地區於 1698 年採用,英國於 1752 年採用,俄羅斯於 1918 年採用(根據格里曆,1917 年的十月革命發生在 11 月)。

此模組中的格里曆延伸回溯至西元年 0 年。對於給定的日期,格里曆日是直到且包含指定日期的天數。同樣地,指定日期和時間的格里曆秒是直到且包含指定日期和時間的秒數。

若要計算時間中不同時期的差異,請使用計算格里曆日或秒的函數。如果時期指定為本地時間,則必須將其轉換為世界時間,才能取得時期之間經過時間的正確值。不建議使用函數 time_difference/2

對於一年中的週數,存在不同的定義。此模組包含符合 ISO 8601 標準的一年中的週數實作。由於指定日期的週數可能落在前一年、當年或下一年,因此指定年份和週數非常重要。函數 iso_week_number/0iso_week_number/1 會回傳年份和週數的元組。

閏年

每四年為閏年的概念並不完全正確。根據格里曆規則,如果以下規則之一有效,則年份 Y 為閏年

  • Y 可被 4 整除,但不能被 100 整除。
  • Y 可被 400 整除。

因此,1996 年是閏年,1900 年不是,但 2000 年是。

日期和時間來源

本地時間從 Erlang BIF localtime/0 取得。世界時間從 BIF universaltime/0 計算。

以下適用

  • 一天有 86400 秒。
  • 普通一年有 365 天。
  • 閏年有 366 天。
  • 4 年期間有 1461 天。
  • 100 年期間有 36524 天。
  • 400 年期間有 146097 天。
  • 西元 0 年 1 月 1 日到 1970 年 1 月 1 日之間有 719528 天。

摘要

類型

使用格里曆的日期。

該月的最後一天。

rfc3339 轉換函數使用的時間單位。

使用格里曆的年份。

函數

計算從西元年 0 年開始,到指定日期結束的格里曆天數。

計算從西元年 0 年開始,到指定日期和時間結束的格里曆秒數。

從指定的 YearMonthDay 計算星期幾。以 1:星期一、2:星期二等形式回傳星期幾。

從指定的格里曆天數計算日期。

從指定的格里曆秒數計算日期和時間。

檢查指定的年份是否為閏年。

回傳表示實際日期 ISO 週數的元組 {Year, WeekNum}。若要確定實際日期,請使用函數 local_time/0

回傳表示指定日期 ISO 週數的元組 {Year, WeekNum}

計算一個月中的天數。

回傳基礎作業系統回報的本地時間。

從本地時間轉換為世界協調時間 (UTC)。DateTime1 必須是指 1970 年 1 月 1 日之後的本地日期。

從本地時間轉換為世界協調時間 (UTC)。DateTime1 必須是指 1970 年 1 月 1 日之後的本地日期。

回傳從 erlang:timestamp/0 的回傳值轉換的世界協調時間 (UTC)。

回傳從 erlang:timestamp/0 的回傳值轉換的本地日期和時間。

回傳從 erlang:timestamp/0 的回傳值轉換的世界協調時間 (UTC)。

將 RFC 3339 時間戳記轉換為系統時間。RFC 3339 時間戳記的資料格式在 RFC 3339 中說明。從 OTP 25.1 開始,時區的分鐘部分是選用的。

將指定的秒數轉換為天、小時、分鐘和秒。Time 永遠是非負數,但如果引數 Seconds 為負數,則 Days 為負數。

從指定的秒數計算時間。Seconds 必須小於每天的秒數 (86400)。

將指定的系統時間轉換為本地日期和時間。

將系統時間轉換為 RFC 3339 時間戳記。

將指定的系統時間轉換為世界日期和時間。

回傳兩個 {Date, Time} 元組之間的差異。T2 應參考晚於 T1 的時期。

回傳從午夜到指定時間的秒數。

回傳基礎作業系統回報的世界協調時間 (UTC)。如果無法使用世界時間,則回傳本地時間。

從世界協調時間 (UTC) 轉換為本地時間。DateTime 必須是指 1970 年 1 月 1 日之後的日期。

此函數檢查日期是否有效。

類型

-type date() :: {year(), month(), day()}.

使用格里曆的日期。

所有 API 都預期這是一個有效的日期。如果日期的來源不明,請在使用之前呼叫 valid_date/1 來驗證它是否有效。

-type datetime1970() :: {{year1970(), month(), day()}, time()}.
-type datetime() :: {date(), time()}.
-type day() :: 1..31.
-type daynum() :: 1..7.
-type hour() :: 0..23.
-type ldom() :: 28 | 29 | 30 | 31.

該月的最後一天。

-type minute() :: 0..59.
-type month() :: 1..12.
-type offset() :: [byte()] | (Time :: integer()).
連結到此類型

rfc3339_string()

檢視原始碼 (未匯出)
-type rfc3339_string() :: [byte(), ...].
連結到此類型

rfc3339_time_unit()

檢視原始碼 (未匯出)
-type rfc3339_time_unit() :: microsecond | millisecond | nanosecond | second | native.

rfc3339 轉換函數使用的時間單位。

注意

在 OTP 25.0 中,將 native 時間單位新增至 rfc3339_time_unit/0

-type second() :: 0..59.
連結到此類型

secs_per_day()

檢視原始碼 (未匯出)
-type secs_per_day() :: 0..86399.
-type time() :: {hour(), minute(), second()}.
-type weeknum() :: 1..53.
-type year1970() :: 1970..10000.
-type year() :: non_neg_integer().

使用格里曆的年份。

年份不能縮寫。例如,93 代表 93 年,而不是 1993 年。有效範圍取決於底層作業系統。

連結到此類型

yearweeknum()

檢視原始碼 (未匯出)
-type yearweeknum() :: {year(), weeknum()}.

函式

此函式的連結

date_to_gregorian_days(Date)

檢視原始碼
-spec date_to_gregorian_days(Date) -> Days when Date :: date(), Days :: non_neg_integer().

計算從西元年 0 年開始,到指定日期結束的格里曆天數。

此函式的連結

date_to_gregorian_days(Year, Month, Day)

檢視原始碼
-spec date_to_gregorian_days(Year, Month, Day) -> Days
                                when
                                    Year :: year(),
                                    Month :: month(),
                                    Day :: day(),
                                    Days :: non_neg_integer().

等同於 date_to_gregorian_days({Year, Month, Day})

此函式的連結

datetime_to_gregorian_seconds(DateTime)

檢視原始碼
-spec datetime_to_gregorian_seconds(DateTime) -> Seconds
                                       when DateTime :: datetime(), Seconds :: non_neg_integer().

計算從西元年 0 年開始,到指定日期和時間結束的格里曆秒數。

-spec day_of_the_week(Date) -> daynum() when Date :: date().

從指定的 YearMonthDay 計算星期幾。以 1:星期一、2:星期二等形式回傳星期幾。

此函式的連結

day_of_the_week(Year, Month, Day)

檢視原始碼
-spec day_of_the_week(Year, Month, Day) -> daynum() when Year :: year(), Month :: month(), Day :: day().

等同於 day_of_the_week({Year, Month, Day})

此函式的連結

gregorian_days_to_date(Days)

檢視原始碼
-spec gregorian_days_to_date(Days) -> date() when Days :: non_neg_integer().

從指定的格里曆天數計算日期。

此函式的連結

gregorian_seconds_to_datetime(Seconds)

檢視原始碼
-spec gregorian_seconds_to_datetime(Seconds) -> datetime() when Seconds :: non_neg_integer().

從指定的格里曆秒數計算日期和時間。

-spec is_leap_year(Year) -> boolean() when Year :: year().

檢查指定的年份是否為閏年。

此函式的連結

iso_week_number()

檢視原始碼 (自 OTP R14B02 起)
-spec iso_week_number() -> yearweeknum().

回傳表示實際日期 ISO 週數的元組 {Year, WeekNum}。若要確定實際日期,請使用函數 local_time/0

此函式的連結

iso_week_number(Date)

檢視原始碼 (自 OTP R14B02 起)
-spec iso_week_number(Date) -> yearweeknum() when Date :: date().

回傳表示指定日期 ISO 週數的元組 {Year, WeekNum}

此函式的連結

last_day_of_the_month(Year, Month)

檢視原始碼
-spec last_day_of_the_month(Year, Month) -> LastDay
                               when Year :: year(), Month :: month(), LastDay :: ldom().

計算一個月中的天數。

-spec local_time() -> datetime().

回傳基礎作業系統回報的本地時間。

此函式的連結

local_time_to_universal_time(DateTime1)

檢視原始碼
此函式已過時。calendar:local_time_to_universal_time/1 已過時;請改用 calendar:local_time_to_universal_time_dst/1。
-spec local_time_to_universal_time(DateTime1) -> DateTime2
                                      when DateTime1 :: datetime1970(), DateTime2 :: datetime1970().

從本地時間轉換為世界協調時間 (UTC)。DateTime1 必須是指 1970 年 1 月 1 日之後的本地日期。

警告

此函式已過時。請改用 local_time_to_universal_time_dst/1,因為它能提供更正確和完整結果。特別是在切換日光節約時間時跳過的不存在期間,此函式仍然會返回結果。

此函式的連結

local_time_to_universal_time_dst(DateTime1)

檢視原始碼
-spec local_time_to_universal_time_dst(DateTime1) -> [DateTime]
                                          when DateTime1 :: datetime1970(), DateTime :: datetime1970().

從本地時間轉換為世界協調時間 (UTC)。DateTime1 必須是指 1970 年 1 月 1 日之後的本地日期。

傳回值是一個包含 0、1 或 2 個可能的 UTC 時間的清單

  • [] - 對於切換日光節約時間時跳過期間的本地 {Date1, Time1},沒有對應的 UTC,因為本地時間是非法的(它從未發生過)。

  • [DstDateTimeUTC, DateTimeUTC] - 對於切換日光節約時間時重複期間的本地 {Date1, Time1},存在兩個對應的 UTC;一個是日光節約時間仍然有效時的期間的第一個實例,另一個是第二個實例。

  • [DateTimeUTC] - 對於所有其他本地時間,只有一個對應的 UTC。

-spec now_to_datetime(Now) -> datetime1970() when Now :: erlang:timestamp().

回傳從 erlang:timestamp/0 的回傳值轉換的世界協調時間 (UTC)。

此函式的連結

now_to_local_time(Now)

檢視原始碼
-spec now_to_local_time(Now) -> datetime1970() when Now :: erlang:timestamp().

回傳從 erlang:timestamp/0 的回傳值轉換的本地日期和時間。

此函式的連結

now_to_universal_time(Now)

檢視原始碼
-spec now_to_universal_time(Now) -> datetime1970() when Now :: erlang:timestamp().

回傳從 erlang:timestamp/0 的回傳值轉換的世界協調時間 (UTC)。

此函式的連結

rfc3339_to_system_time(DateTimeString)

檢視原始碼 (自 OTP 21.0 起)
-spec rfc3339_to_system_time(DateTimeString) -> integer() when DateTimeString :: rfc3339_string().

等同於 rfc3339_to_system_time(DateTimeString, [])

此函式的連結

rfc3339_to_system_time(DateTimeString, Options)

檢視原始碼 (自 OTP 21.0 起)
-spec rfc3339_to_system_time(DateTimeString, Options) -> integer()
                                when
                                    DateTimeString :: rfc3339_string(),
                                    Options :: [Option],
                                    Option :: {unit, rfc3339_time_unit()}.

將 RFC 3339 時間戳記轉換為系統時間。RFC 3339 時間戳記的資料格式在 RFC 3339 中說明。從 OTP 25.1 開始,時區的分鐘部分是選用的。

有效的選項

  • {unit, Unit} - 傳回值的時間單位。預設值為 second
1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
1517498278
2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
   [{unit, nanosecond}]).
1517498282088000000
此函式的連結

seconds_to_daystime(Seconds)

檢視原始碼
-spec seconds_to_daystime(Seconds) -> {Days, Time}
                             when Seconds :: integer(), Days :: integer(), Time :: time().

將指定的秒數轉換為天、小時、分鐘和秒。Time 永遠是非負數,但如果引數 Seconds 為負數,則 Days 為負數。

此函式的連結

seconds_to_time(Seconds)

檢視原始碼
-spec seconds_to_time(Seconds) -> time() when Seconds :: secs_per_day().

從指定的秒數計算時間。Seconds 必須小於每天的秒數 (86400)。

此函式的連結

system_time_to_local_time(Time, TimeUnit)

檢視原始碼 (自 OTP 21.0 起)
-spec system_time_to_local_time(Time, TimeUnit) -> datetime()
                                   when Time :: integer(), TimeUnit :: erlang:time_unit().

將指定的系統時間轉換為本地日期和時間。

此函式的連結

system_time_to_rfc3339(Time)

檢視原始碼 (自 OTP 21.0 起)
-spec system_time_to_rfc3339(Time) -> DateTimeString
                                when Time :: integer(), DateTimeString :: rfc3339_string().

等同於 system_time_to_rfc3339(Time, [])

此函式的連結

system_time_to_rfc3339(Time, Options)

檢視原始碼 (自 OTP 21.0 起)
-spec system_time_to_rfc3339(Time, Options) -> DateTimeString
                                when
                                    Time :: integer(),
                                    Options :: [Option],
                                    Option ::
                                        {offset, offset()} |
                                        {time_designator, byte()} |
                                        {unit, rfc3339_time_unit()},
                                    DateTimeString :: rfc3339_string().

將系統時間轉換為 RFC 3339 時間戳記。

RFC 3339 時間戳記的資料格式由 RFC 3339 描述。位移的資料格式也由 RFC 3339 描述。

有效的選項

  • {offset, Offset} - 要包含在格式化字串中的位移,可以是字串或整數。空字串(預設值)會被解譯為本地時間。非空字串會按原樣包含。整數的時間單位與 Time 的時間單位相同。

  • {time_designator, Character} - 用作時間指示符的字元,也就是日期和時間分隔符。預設值為 $T

  • {unit, Unit} - Time 的時間單位。預設值為 second。如果給定其他單位(millisecondmicrosecondnanosecondnative),格式化的字串會包含秒的小數部分。小數秒位數為三位、六位或九位,取決於選擇的時間單位。對於 native,會包含三位小數。請注意,不會從分數中刪除尾隨零。

1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
"2018-04-23T14:56:28+02:00"
2> calendar:system_time_to_rfc3339(erlang:system_time(second),
   [{offset, "-02:00"}]).
"2018-04-23T10:56:52-02:00"
3> calendar:system_time_to_rfc3339(erlang:system_time(second),
   [{offset, -7200}]).
"2018-04-23T10:57:05-02:00"
4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
"2018-04-23 12:57:20.482Z"
此函式的連結

system_time_to_universal_time(Time, TimeUnit)

檢視原始碼 (自 OTP 21.0 起)
-spec system_time_to_universal_time(Time, TimeUnit) -> datetime()
                                       when Time :: integer(), TimeUnit :: erlang:time_unit().

將指定的系統時間轉換為世界日期和時間。

此函式的連結

time_difference(T1, T2)

檢視原始碼
-spec time_difference(T1, T2) -> {Days, Time}
                         when T1 :: datetime(), T2 :: datetime(), Days :: integer(), Time :: time().

回傳兩個 {Date, Time} 元組之間的差異。T2 應參考晚於 T1 的時期。

警告

此函式已過時。請改用格里高利日和秒的轉換函式。

-spec time_to_seconds(Time) -> secs_per_day() when Time :: time().

回傳從午夜到指定時間的秒數。

-spec universal_time() -> datetime().

回傳基礎作業系統回報的世界協調時間 (UTC)。如果無法使用世界時間,則回傳本地時間。

此函式的連結

universal_time_to_local_time(DateTime)

檢視原始碼
-spec universal_time_to_local_time(DateTime) -> datetime() when DateTime :: datetime1970().

從世界協調時間 (UTC) 轉換為本地時間。DateTime 必須是指 1970 年 1 月 1 日之後的日期。

-spec valid_date(Date) -> boolean() when Date :: date().

此函數檢查日期是否有效。

此函式的連結

valid_date(Year, Month, Day)

檢視原始碼
-spec valid_date(Year, Month, Day) -> boolean()
                    when Year :: integer(), Month :: integer(), Day :: integer().

等同於 valid_date({Year, Month, Day})