blob: ca0f00d785dcf761f90b70fb6181feaea1c35f96 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
/*
** scalar date routines -- public domain by Ray Gardner
** These will work over the range 1/01/01 thru 14699/12/31
*/
#include "scaldate.h"
int isleap (unsigned yr)
{
return yr % 400 == 0 || (yr % 4 == 0 && yr % 100 != 0);
}
static unsigned months_to_days (unsigned month)
{
return (month * 3057 - 3007) / 100;
}
static long years_to_days (unsigned yr)
{
return yr * 365L + yr / 4 - yr / 100 + yr / 400;
}
long ymd_to_scalar (unsigned yr, unsigned mo, unsigned day)
{
long scalar;
scalar = day + months_to_days(mo);
if ( mo > 2 ) /* adjust if past February */
scalar -= isleap(yr) ? 1 : 2;
yr--;
scalar += years_to_days(yr);
return scalar;
}
void scalar_to_ymd (long scalar, unsigned *yr, unsigned *mo, unsigned *day)
{
unsigned n; /* compute inverse of years_to_days() */
for ( n = (unsigned)((scalar * 400L) / 146097); years_to_days(n) < scalar;)
n++; /* 146097 == years_to_days(400) */
*yr = n;
n = (unsigned)(scalar - years_to_days(n-1));
if ( n > 59 ) { /* adjust if past February */
n += 2;
if ( isleap(*yr) )
n -= n > 62 ? 1 : 2;
}
*mo = (n * 100 + 3007) / 3057; /* inverse of months_to_days() */
*day = n - months_to_days(*mo);
}
|