##// END OF EJS Templates
Review updata app
Review updata app

File last commit:

r0:b84e1135c2c4
r8:9c1b6919a8a9
Show More
date.c
201 lines | 4.7 KiB | text/x-c | CLexer
/* $Id: date.c 3304 2011-01-17 15:25:59Z brideout $ */
#include "date.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
/***********************************************************************
* jday - returns Julian day number given day, month, and year
*
* Julian day 0 is Nov. 24, -4713
*
* Returns -1 if illegal year, month, day passed in
*/
int jday(int day, int month, int year)
{
int jdayno, y, c, ya, m;
if (idmyck(day, month, year) != 0) return(-1);
m = month;
if (m > 2) {
m = month - 3;
y = year;
} else {
m = month + 9;
y = year - 1;
}
c = y/100;
ya = y - 100*c;
jdayno = (146097*c)/4+(1461*ya)/4 + (153*m + 2)/5 + day + 1721119;
return(jdayno);
}
/***********************************************************************
* jdater - sets day, month and year given jdayno
*
* Inverse of jday method
*/
int jdater (int jdayno, int *day, int *month, int *year)
{
int j, d, m, y;
if (jdayno < 0) return(1);
j = jdayno - 1721119;
y = (4*j - 1)/146097;
j = 4*j - 1 - 146097*y;
d = j/4;
j = (4*d + 3)/1461;
d = 4*d + 3 - 1461*j;
d = (d + 4)/4;
m = (5*d - 3)/153;
d = 5*d - 3 - 153*m;
d = (d + 5)/5;
y = 100*y + j;
if (m < 10) {
m = m + 3;
}
else {
m = m - 9;
y = y + 1;
}
*day = d;
*month = m;
*year = y;
return(0);
}
/***********************************************************************
*
* idmyck - returns 0 if valid day, month, and year
*
*/
int idmyck(int day, int month, int year)
{
int l;
int numday[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (day < 1 || month < 1 || month > 12 || year < 0 || year > 9999) {
return(1);
}
if (month == 2 && year/4*4 == year &&
(year/400*400 == year || year/100*100 != year))
l = 1;
else {
l = 0;
}
if (day > numday[month-1]+l)
return(1);
return(0);
}
/***********************************************************************
*
* dmadptr - returns number of seconds since 1/1/1950 for iyr, imd, ihm, ics
* as double
*
* Can retain fractions of a second
*
* Inputs: iyr - year
* imd - month/day as integer mmdd
* ihm - hour/min as integer hhmm
* ics - centiseconds since last minute
*
*/
double dmadptr(int iyr, int imd, int ihm, int ics)
{
int n1jan50=2433283, year, month, day, hour, minute;
double second=0.0;
double im1=0.0;
year = iyr;
month = imd/100;
day = imd - 100*month;
hour = ihm/100;
minute = ihm - 100*hour;
second = ics/100.0;
im1 = (jday(day, month, year) - n1jan50)*86400.0 +
hour*3600.0 + minute*60.0 + second;
return (im1);
}
/***********************************************************************
*
* getKey - returns number of seconds since 1/1/1950 for year,
* month, day, hour, minute, second
*
*/
double getKey(int year, int month, int day,
int hour, int minute, int second)
{
return(dmadptr(year, 100*month+day, 100*hour+minute, 100*second));
}
/***********************************************************************
*
* dinvmadptr - sets iyr, imd, ihm, ics given dmadptr (number of seconds
* as a double since 1/1/1950)
*
* inverse of dmadptr.
*
* Returns 0 if success, 1 if failure (out of range time)
* Uses time.h, and constant to shift from 1/1/1970 to 1/1/1950
*/
int dinvmadptr(double dmadptr, int * iyr, int * imd, int * ihm, int * ics)
{
struct tm * now = NULL;
time_t time_mad = (long)(dmadptr - 631152000.0); /* number of seconds from 1/1/1950 to 1/1/1970 */
now = gmtime(&time_mad);
*iyr = 1900 + now->tm_year; /* since tm_year is years since 1900 */
*imd = 100 * (1 + now->tm_mon) + now->tm_mday; /* since tm_mon is 0-11 */
*ihm = 100 * now->tm_hour + now->tm_min;
*ics = 100 * now->tm_sec;
/* add any fractional part of dmadptr to ics */
*ics += (int)(fmod(dmadptr, 1.0)*100);
return(0);
}
/***********************************************************************
*
* madGetDayno - gets day number (1-366) given year, month, and day
*
*
* Returns -1 if illegal year, month, day passed in
*/
int madGetDayno(int year, int month, int day)
{
time_t time_mad = 0;
struct tm * now = NULL;
int imd = 100*month + day;
double madptr = 0.0;
if (idmyck(day, month, year) != 0) return(-1);
madptr = dmadptr(year, imd, 0, 0);
time_mad = (long)(madptr - 631152000.0); /* number of seconds from 1/1/1950 to 1/1/1970 */
now = gmtime(&time_mad);
return(now->tm_yday + 1); /* tm_yday goes from 0 to 365 */
}