查看源代码 calendar (stdlib v6.2)

本地时间和世界时间、星期几、日期和时间转换。

此模块提供本地时间和世界时间、星期几以及许多时间转换函数的计算。

当时间根据当前时区和夏令时进行调整时,该时间是本地时间。当时间反映经度为零时的时间,而无需对夏令时进行任何调整时,该时间是世界时间。世界协调时间 (UTC) 也称为格林威治标准时间 (GMT)。

此模块中的时间函数 local_time/0universal_time/0 均返回日期和时间。这是因为单独的日期和时间函数可能会导致日期/时间组合错位 24 小时。如果其中一个函数在午夜之前调用,而另一个函数在午夜之后调用,则会发生这种情况。此问题也适用于 Erlang BIF 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.
链接到此类型

daynum()

查看源代码 (未导出)
-type daynum() :: 1..7.
-type hour() :: 0..23.
-type ldom() :: 28 | 29 | 30 | 31.

该月的最后一天。

链接到此类型

minute()

查看源代码 (未导出)
-type minute() :: 0..59.
-type month() :: 1..12.
链接到此类型

offset()

查看源代码 (未导出)
-type offset() :: [byte()] | (Time :: integer()).
链接到此类型

rfc3339_string()

查看源代码 (未导出)
-type rfc3339_string() :: [byte(), ...].
链接到此类型

rfc3339_time_unit()

查看源代码 (未导出)
-type rfc3339_time_unit() :: microsecond | millisecond | nanosecond | second | native.

rfc3339 转换函数使用的时间单位。

注意

native 时间单位已添加到 OTP 25.0 中的 rfc3339_time_unit/0

链接到此类型

second()

查看源代码 (未导出)
-type second() :: 0..59.
链接到此类型

secs_per_day()

查看源代码 (未导出)
-type secs_per_day() :: 0..86399.
-type time() :: {hour(), minute(), second()}.
链接到此类型

weeknum()

查看源代码 (未导出)
-type weeknum() :: 1..53.
链接到此类型

year1970()

查看源代码 (未导出)
-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})