This week's LFE Friday was translated with permission from the Erlang Thursday series by Steven Proctor. This week's translator: Robert Virding.

Today’s LFE Friday covers calendar:date_to_gregorian_days/3.

As we saw in last week’s LFE Friday on calendar:day_of_the_week/3 when we were looking at some error messages, we saw that the errors were coming from calendar:date_to_gregorian_days/3.

> (calendar:day_of_the_week 0 0 0)        
exception error: function_clause
  in (: calendar date_to_gregorian_days 0 0 0)
  in calendar:day_of_the_week/3 (calendar.erl, line 151)
> (calendar:day_of_the_week 1970 2 31)   
exception error: if_clause
  in calendar:date_to_gregorian_days/3 (calendar.erl, line 116)
  in calendar:day_of_the_week/3 (calendar.erl, line 151)
> (calendar:day_of_the_week 1970 13 2)
exception error: function_clause
  in (: calendar last_day_of_the_month1 1970 13)
  in calendar:date_to_gregorian_days/3 (calendar.erl, line 115)
  in calendar:day_of_the_week/3 (calendar.erl, line 151)

I promised you at the end of that post we would take a deeper look at calendar:date_to_gregorian_days/3 next time, so let’s fulfill that promise.

calendar:date_to_gregorian_days/3 takes three arguments, a non-negative integer for the year, an integer between 1 and 12 (inclusive) for the month, and an integer between 1 and 31 (inclusive) for the day of the month, and returns the number of days since 0000-01-01 in the Gregorian calendar.

> (calendar:date_to_gregorian_days 2015 4 19)
736072
> (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

There is also a version calendar:date_to_gregorian_days/1, that takes a tuple of year, month, and day available if your code already has the date in tuple format.

> (calendar:date_to_gregorian_days #(2015 4 19))
736072
> (calendar:date_to_gregorian_days #(0 1 1))    
0
> (calendar:date_to_gregorian_days #(1 1 1))
366

And if we pass something invalid to calendar:date_to_gregorian_days/1, we see that it is calling calendar:date_to_gregorian_days/3. So it is just a nice helper function that does the pattern match destructing for us.

> (calendar:date_to_gregorian_days #(1 1 0))
exception error: function_clause
  in (: calendar date_to_gregorian_days 1 1 0)

-Proctor, Robert



Author

Published

20 April 2015

Category

tutorials

Tags