📄 cmp_time.c
字号:
/*===========================================================================*//* DMC Interim | cmp_time | utility *//*===========================================================================*//* Name: cmp_time Purpose:compare two times in struct input_time format Usage: int cmp_time (); struct input_time time1; struct input_time time2; long precision; int result; result = cmp_time (time1, time2, precision); Input: time1 = 1st time in struct input_time format time2 = 2nd time in struct input_time format precision = comparison precision in e-04 sec >= 0 (e.g., 50% of sample interval) Output: result = 0 if time1 == time2 (diff <= precision) = -1 if time1 < time2 = 1 if time1 > time2 Externals: none Warnings: none Errors: none Called by: anything Calls to: none Algorithm: Compute dates relative to january 1 of the lesser year and compare. If difference greater than 2 days, return appropriate inequality. Otherwise, compute daytimes in e-04 sec relative to midnite. Take any difference in date into account and compare the times. If difference <= precision, return an equality, else return the appropriate inequality. Notes: The time structure looks like: struct input_time { unsigned short int year; unsigned short int day; char hour; char minute; char second; unsigned short int fracsec; }; Problems:Maximum effective precision is 48 hours. Tolerances of greater than ~59.65 hours will overflow. Debug: level D_MIN - level D_MED - level D_MAX - print out start, comparison and finish notices References: none Language: ANSI standard C Author: Kevin MacKenzie 28 mar 1989 Revisions:*/#include "output.h"#define isaleap(year) (((year%100 != 0) && (year%4 == 0)) || (year%400 == 0))#define ONEDAY 86400L /* one day in sec */int cmp_time (time1, time2, precision)struct input_time time1; /* first time to compare */struct input_time time2; /* second time to compare */long precision; /* comparison precision, e-04 sec */{ register long diff; /* value difference */ register long dtime1 = 0; /* daytime #1 in e-04 sec */ register long dtime2 = 0; /* daytime #2 in e-04 sec */ unsigned short int lenyr; /* length of year in days */ int err; /* result */ if (precision < 0) precision = 0; /* precision must be >= 0 */ /* compare years */ diff = (long)time1.year - (long)time2.year; if (diff == 0) ; /* difference < 1 year */ else if (diff == 1) { /* difference near year end */ lenyr = (isaleap (time2.year)) ? 366 : 365; /* get length of year */ time1.day += lenyr; } else if (diff == -1) { /* difference near year end */ lenyr = (isaleap (time1.year)) ? 366 : 365; /* get length of year */ time2.day += lenyr; } else if (diff > 1) return (err = 1); /* time1 >>> time2 */ else if (diff < -1) return (err = -1); /* time1 <<< time2 */ /* compare dates */ diff = (long)time1.day - (long)time2.day; if (diff > 1) return (err = 1); /* time1 >> time2 */ else if (diff < -1) return (err = -1); /* time1 << time2 */ else { /* difference < 2 days */ dtime1 += diff * ONEDAY; /* difference in dates */ dtime1 += (time1.hour*3600)+(time1.minute*60)+time1.second; /* sec*/ dtime1 *= 10000; /* convert sec to e-04 sec*/ dtime1 += time1.fracsec; dtime2 += (time2.hour*3600)+(time2.minute*60)+time2.second; /* sec*/ dtime2 *= 10000; /* convert sec to e-04 sec*/ dtime2 += time2.fracsec; } /* compare daytimes */ if (dtime1 - dtime2 > precision) return (err = 1); /* time1 > time2 */ else if (dtime2 - dtime1 > precision) return (err = -1); /* time1 < time2 */ return (err = 0); /* time1 == time2 */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -