2023-04-05

(sph time gregorian)

gregorian calendar calculations

part of sph-lib

library description

uses a year 0 like iso8601. a year 0 appears to keep leap-day calculations simpler

module name

(sph time gregorian)

exported bindings

procedure: greg-days->leap-days a ->
integer -> integer
gives the number of leap days in a given time span of full days.
works with positive and negative day values and considers partial years where the leap day always falls on february 29.
the calculation for negative values is similar to greg-years->leap-days, based on the fact that the formula for
positive values can be used as long as year 0 is ignored.
for day totals shorter than a year we check if the leap day in year 0 has passed.
for longer day totals the contained cycles are counted, like for positive values.
procedure: greg-days->year a ->
procedure: greg-days->year-days a leap-year? ->
gives the number of days elapsed in a year. handles negative years/days
procedure: greg-days->years a ->
integer -> integer
the number of years the given number of days fill
procedure: greg-month->days a leap-year? ->
integer boolean -> integer
gives the number of days needed to reach the first day of the given month.
months are from 1-12
variable: greg-month-days
syntax: greg-month-days-get leap-year?
variable: greg-month-days-leap-year
variable: greg-number-of-months
procedure: greg-week-day year month day ->
integer integer integer -> integer
0 being monday
variable: greg-year-1970-days
procedure: greg-year->years a ->
variable: greg-year-days
procedure: greg-year-days->month-and-day& a greg-month-days c ->
integer #(days-of-month ...) procedure:{month day -> any} -> any
get the month and month day after the given number of days have passed starting from the beginning of the year
variable: greg-year-days-leap-year
procedure: greg-year-first-week-day a ->
procedure: greg-year-leap-year? a ->
integer:year-number -> boolean
check if the given year is a leap year
procedure: greg-year-weeks-53? a ->
integer:year-number -> boolean
check if the given year number corresponds to a year with 53 instead of 52 weeks according to the iso8601 standard
procedure: greg-years->days a ->
integer -> integer
gives the days contained in given number of fully elapsed years
procedure: greg-years->leap-days a ->
procedure: greg-years->year a ->
does not work reliably when year is negative and part of a date with advanced months or days,
because advancing days in a negative year reduce the number of elapsed years but not the year number
variable: sph-time-gregorian-description