diff --git a/src/xpdev/datewrap.c b/src/xpdev/datewrap.c index 3ee9334e01ffa70a4125fc0892b127580158ce2e..165e3ba90df924cc6e2a749a101152733f06163c 100644 --- a/src/xpdev/datewrap.c +++ b/src/xpdev/datewrap.c @@ -41,39 +41,48 @@ /**********************************************/ /* Decimal-coded ISO-8601 date/time functions */ /**********************************************/ +isoDateTime_t isoDateTime_create(unsigned year, unsigned month, unsigned day + ,unsigned hour, unsigned minute, unsigned second) +{ + isoDateTime_t isoDateTime; + + isoDateTime.date=(year*10000)+(month*100)+day; + isoDateTime.time=(hour*10000)+(minute*100)+second; + + return(isoDateTime); + +} + isoDateTime_t time_to_isoDateTime(time_t time) { + isoDateTime_t never = {0,0}; struct tm tm; - isoDateTime_t isoDateTime = {0,0}; if(time==0) - return(isoDateTime); + return(never); ZERO_VAR(tm); if(gmtime_r(&time,&tm)==NULL) - return(isoDateTime); + return(never); - isoDateTime.date=((tm.tm_year+1900)*10000)+((tm.tm_mon+1)*100)+tm.tm_mday; - isoDateTime.time=(tm.tm_hour*10000)+(tm.tm_min*100)+tm.tm_sec; - - return(isoDateTime); + return(isoDateTime_create(tm.tm_year+1900,tm.tm_mon+1,tm.tm_mday,tm.tm_hour,tm.tm_min,tm.tm_sec)); } -long time_to_isoDate(time_t time) +isoDate_t time_to_isoDate(time_t time) { isoDateTime_t isoDateTime = time_to_isoDateTime(time); return(isoDateTime.date); } -long time_to_isoTime(time_t time) +isoTime_t time_to_isoTime(time_t time) { isoDateTime_t isoDateTime = time_to_isoDateTime(time); return(isoDateTime.time); } -time_t isoDate_to_time(long date, long time) +time_t isoDate_to_time(isoDate_t date, isoTime_t time) { struct tm tm; @@ -82,13 +91,13 @@ time_t isoDate_to_time(long date, long time) if(date==0) return(0); - tm.tm_year=date/10000; - tm.tm_mon=(date/100)%100; - tm.tm_mday=date%100; + tm.tm_year =isoDate_year(date); + tm.tm_mon =isoDate_month(date); + tm.tm_mday =isoDate_day(date); - tm.tm_hour=time/10000; - tm.tm_min=(time/100)%100; - tm.tm_sec=time%100; + tm.tm_hour =isoTime_hour(time); + tm.tm_min =isoTime_minute(time); + tm.tm_sec =isoTime_second(time); /* correct for tm-weirdness */ if(tm.tm_year>=1900) diff --git a/src/xpdev/datewrap.h b/src/xpdev/datewrap.h index 7485f8df12a1d00de6d49c9085e66ac1c5c242fe..516aab286790a3c83b1a5b1f8ea321181fb71d21 100644 --- a/src/xpdev/datewrap.h +++ b/src/xpdev/datewrap.h @@ -44,15 +44,28 @@ /* Decimal-coded ISO-8601 date/time functions */ /**********************************************/ +typedef long isoDate_t; /* CCYYMMDD (decimal) */ +typedef int isoTime_t; /* HHMMSS (decimal) */ + typedef struct { - long date; /* CCYYMMDD (decimal) */ - long time; /* HHMMSS (decimal) */ + isoDate_t date; + isoTime_t time; } isoDateTime_t; -long time_to_isoDate(time_t); -long time_to_isoTime(time_t); +#define isoDate_year(date) ((date)/10000) +#define isoDate_month(date) (((date)/100)%100) +#define isoDate_day(date) ((date)%100) + +#define isoTime_hour(time) ((time)/10000) +#define isoTime_minute(time) (((time)/100)%100) +#define isoTime_second(time) ((time)%100) + +isoDateTime_t isoDateTime_create(unsigned year, unsigned month, unsigned day + ,unsigned hour, unsigned minute, unsigned second); +isoDate_t time_to_isoDate(time_t); +isoTime_t time_to_isoTime(time_t); isoDateTime_t time_to_isoDateTime(time_t); -time_t isoDate_to_time(long date, long time); +time_t isoDate_to_time(isoDate_t date, isoTime_t time); time_t isoDateTime_to_time(isoDateTime_t);