Erlang Thursday – calendar:date_to_gregorian_days/3

今天的Erlang Thursday讲的是 calendar:date_to_gregorian_days/3.

正如我们上星期在 Erlang Thursday calendar:day_of_the_week/3 中讲到的,当我们看到一些错误消息的时候,我们看到错误来自于 calendar:date_to_gregorian_days/3。

1
2
3
4
5
6
7
8
9
10
11
calendar:day_of_the_week(0, 0, 0).
% ** exception error: no function clause matching calendar:date_to_gregorian_days(0,0,0) (calendar.erl, line 114)
% in function calendar:day_of_the_week/3 (calendar.erl, line 151)
calendar:day_of_the_week(1970, 2, 31).
% ** exception error: no true branch found when evaluating an if expression
% in function calendar:date_to_gregorian_days/3 (calendar.erl, line 116)
% in call from calendar:day_of_the_week/3 (calendar.erl, line 151)
calendar:day_of_the_week(1970, 13, 2).
% ** exception error: no function clause matching calendar:last_day_of_the_month1(1970,13) (calendar.erl, line 243)
% in function calendar:date_to_gregorian_days/3 (calendar.erl, line 115)
% in call from calendar:day_of_the_week/3 (calendar.erl, line 151)

在上星期那篇文章里我保证我们下次将深入了解 calendar:date_to_gregorian_days/3 ,所以现在让我们来完成这个任务。

calendar:date_to_gregorian_days/3 有三个入参,一个代表年份的非负整数,一个代表月份的从1到12的整数,一个代表某月第几日的从1到31的整数,该函数返回的值是从公元元年1月1日截止到入参日期的天数。

1
2
3
4
5
6
7
8
9
10
calendar:date_to_gregorian_days(2015, 4, 16).
% 736069
calendar:date_to_gregorian_days(0, 1, 1).
% 0
calendar:date_to_gregorian_days(1, 1, 1).
% 366
calendar:date_to_gregorian_days(1970, 1, 1).
% 719528
calendar:date_to_gregorian_days(1999, 12, 31).
% 730484

还有一个只接收一个入参的版本 calendar:date_to_gregorian_days/1,它的入参是由年、月、日三个整数组成元组。

1
2
3
4
5
6
calendar:date_to_gregorian_days({2015, 4, 16}).
% 736069
calendar:date_to_gregorian_days({0, 1, 1}).
% 0
calendar:date_to_gregorian_days({1, 1, 1}).
% 366

如果我们传给 calendar:date_to_gregorian_days/1 无效的日期,我们就会在错误消息里看到它正在调用 calendar:date_to_gregorian_days/3 。所以它是一个不错的辅助函数,不破坏我们的模式匹配。

1
2
calendar:date_to_gregorian_days({1, 1, 0}).
** exception error: no function clause matching calendar:date_to_gregorian_days(1,1,0) (calendar.erl, line 114)

原文链接: https://www.proctor-it.com/erlang-thursday-calendar-date_to_gregorian_days-3/