17#include "time_utils.h"
31 year = year < 100 ? (year > 95 ? year + 1900 : year + 2000) : year;
32 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
38static const short DaysInMonths[2][12] = {
79 short leapYear, jday, i, daysInMonth;
81 if (year <= 0 || month < 1 || month > 12 || day < 1 || !julianDay)
85 daysInMonth = DaysInMonths[leapYear][month - 1];
86 if (day > daysInMonth)
90 for (i = 1; i < month; i++)
91 jday += DaysInMonths[leapYear][i - 1];
106 short leapYear, sum, i, days;
108 if (julianDay < 0 || julianDay > 366 || year <= 0 || !month || !day)
111 if ((leapYear == 0 && julianDay >= 365) || julianDay >= 366) {
118 for (i = 1; i <= 12; i++) {
119 days = DaysInMonths[leapYear][i - 1];
120 if (sum + days < julianDay) {
126 *day = julianDay - sum;
143short TimeEpochToBreakdown(
short *year,
short *jDay,
short *month,
short *day,
double *hour,
double epochTime) {
144 struct tm timeBreakdown;
146 short lyear, ljDay, lhour;
149 if (!mdb_localtime_copy(&theTime, &timeBreakdown))
151 lyear = timeBreakdown.tm_year + 1900;
152 ljDay = timeBreakdown.tm_yday + 1;
153 lhour = timeBreakdown.tm_hour;
159 *month = timeBreakdown.tm_mon + 1;
161 *day = timeBreakdown.tm_mday;
165 *hour = (epochTime - dayStartTime) / 3600;
166 if (((
short)*hour) != lhour) {
168 *hour = *hour + lhour - ((short)*hour);
184 short year, jDay, month, day, hr, min;
189 min = 60 * (dayTime - hr);
190 sec = 3600.0 * dayTime - (3600.0 * hr + 60.0 * min);
191 sprintf(text,
"%04hd/%02hd/%02hd %02hd:%02hd:%07.4f",
192 year, month, day, hr, min, sec);
211 struct tm timeBreakdown;
217 memset((
char *)&timeBreakdown, 0,
sizeof(timeBreakdown));
219 timeBreakdown.tm_year = year - 1900;
221 timeBreakdown.tm_year = year;
227 timeBreakdown.tm_mday = iday;
228 timeBreakdown.tm_mon = imonth - 1;
230 timeBreakdown.tm_mday = day;
231 timeBreakdown.tm_mon = month - 1;
234 ihour = timeBreakdown.tm_hour = hour;
235 imin = timeBreakdown.tm_min = fmin = 60 * (hour - ihour);
236 timeBreakdown.tm_sec = fsec = 60 * (fmin - imin);
237 fsec -= timeBreakdown.tm_sec;
238 timeBreakdown.tm_isdst = -1;
240 *epochTime = timelocal(&timeBreakdown) + fsec;
242 *epochTime = mktime(&timeBreakdown) + fsec;
short TimeEpochToBreakdown(short *year, short *jDay, short *month, short *day, double *hour, double epochTime)
Breaks down epoch time into its constituent components.
short IsLeapYear(short year)
Determines whether a given year is a leap year.
short TimeBreakdownToEpoch(short year, short jDay, short month, short day, double hour, double *epochTime)
Converts a broken-down time into epoch time.
short MonthDayFromJulianDay(short julianDay, short year, short *month, short *day)
Converts a Julian day number to month and day components.
short TimeEpochToText(char *text, double epochTime)
Converts epoch time to a formatted text string.
short JulianDayFromMonthDay(short month, short day, short year, short *julianDay)
Computes the Julian day number from a calendar date.