caldate_mjd

## Name

caldate_mjd — manipulate calendar dates

## Synopsis

    #include <caldate.h>

`void caldate_frommjd(` | cd, |
| day, |
| weekday, |
| yearday`)`; |

`struct caldate *cd`;
`long day`;
`int *weekday`;
`int *yearday`;

`long caldate_mjd(` | cd`)`; |

`struct caldate *cd`;

`void caldate_normalize(` | cd`)`; |

`struct caldate *cd`;

`void caldate_easter(` | cd`)`; |

`struct caldate *cd`;

## Basic conversions

Every calendar date has a `modified Julian day number`. The day number increases by 1 every day. Day number 0 is 17 November 1858. Day number 51604 is 1 March 2000.

`caldate_frommjd` puts into `cd` the date corresponding to the modified Julian day number `day`.

`caldate_frommjd` also computes the day of the week (0 through 6) and the day of the year (0 through 365). It stores the day of the week in `*weekday` if `weekday` is nonzero. It stores the day of the year in `*yearday` if `yearday` is nonzero.

`caldate_mjd` returns the modified Julian day number corresponding to the date in `cd`.

`caldate_mjd` accepts days outside the range 1 to 31, referring to days before the beginning or after the end of the month. It also accepts months outside the range 1 to 12, referring to months before the beginning or after the end of the year.

`caldate_normalize` calls `caldate_frommjd` with the result of `caldate_mjd`. This means that it accepts out-of-range months and out-of-range days in `cd`, and puts a valid calendar date back into `cd`.

## Other functions

`caldate_easter` reads the year from `cd` and then changes `cd` to the date of Easter in the same year.

## Limitations

The `caldate` routines currently support the Gregorian calendar, which was defined in 1582 and adopted at different times in different countries. For earlier dates the `caldate` routines work with “virtual Gregorian” (also known as Proleptic Gregorian), defined mathematically by the 400-year Gregorian cycle for years before 1582. The Julian calendar is not supported.

The Gregorian calendar will be replaced by a new calendar within a few thousand years. The `caldate_frommjd` and `caldate_mjd` routines will be upgraded accordingly. The current `caldate_frommjd` and `caldate_mjd` routines are not useful for dates far in the future.

Day numbers will overflow a 32-bit `long` sometime after the year 5000000; all systems should upgrade to 64-bit `long`s before then. `caldate_mjd` does not check for overflow.

## See also

caldate(3)

## Author

Original code and documentation by Daniel J. Bernstein. Converted to DocBook XML by Jonathan de Boyne Pollard.