char *MFDateGetNext () { static char time [MFDateStringLength]; static struct MFDate_s date; int month; date.Year = _MFCurrentDate.Year; date.Month = _MFCurrentDate.Month; date.Day = _MFCurrentDate.Day + 1; if (date.Day > _MFDateMonthLength (date.Year, date.Month)) { date.Day = 1; date.Month++; if (date.Month > 12) { date.Month = 1; if (date.Year != MFDefaultMissingInt) date.Year++; } } date.DayOfYear = 0; for (month = 1;month < _MFCurrentDate.Month;++month) date.DayOfYear += _MFDateMonthLength (date.Year,month); date.DayOfYear += date.Day; if (date.Year != MFDefaultMissingInt) sprintf (time,"%4d",date.Year); else strcpy (time,MFDateClimatologyYearStr); if (date.Month == MFDefaultMissingInt) return (time); sprintf (time + strlen (time),"-%02d",date.Month); if (date.Day == MFDefaultMissingInt) return (time); sprintf (time + strlen (time),"-%02d",date.Day); return (time); }
char *MFDateAdvance () { int month; _MFCurrentDate.Day++; if (_MFCurrentDate.Day > _MFDateMonthLength (_MFCurrentDate.Year,_MFCurrentDate.Month)) { _MFCurrentDate.Day = 1; _MFCurrentDate.Month++; if (_MFCurrentDate.Month > 12) { _MFCurrentDate.Month = 1; if (_MFCurrentDate.Year == MFDefaultMissingInt) return ((char *) NULL); _MFCurrentDate.Year++; } } _MFCurrentDate.DayOfYear = 0; for (month = 1;month < _MFCurrentDate.Month;++month) _MFCurrentDate.DayOfYear += _MFDateMonthLength (_MFCurrentDate.Year,month); _MFCurrentDate.DayOfYear += _MFCurrentDate.Day; return (_MFDateCompare (&_MFCurrentDate,&_MFEndDate) <= 0 ? MFDateGetCurrent () : (char *) NULL); }
static bool _MFDateSet (struct MFDate_s *date,char *dateString) { int month; date->Year = date->Month = date->Day = MFDefaultMissingInt; if ((strncmp (dateString,MFDateClimatologyYearStr,strlen (MFDateClimatologyYearStr)) != 0) && (sscanf (dateString,"%d",&(date->Year)) != 1)) { CMmsgPrint (CMmsgAppError,"Error: Invalid date [%s] in: %s:%d",dateString,__FILE__,__LINE__); return (false); } date->DayOfYear = 183; if (strlen (dateString) == 4) return (true); if (sscanf (dateString + 5,"%d",&(date->Month)) != 1) { CMmsgPrint (CMmsgAppError,"Error: Invalid date [%s] in: %s:%d",dateString,__FILE__,__LINE__); return (false); } date->DayOfYear = 0; for (month = 1;month < date->Month;++month) date->DayOfYear += _MFDateMonthLength (date->Year,month); if (strlen (dateString) == 7) { date->DayOfYear +=_MFDateMonthLength (date->Year,month) / 2; return (true); } if (sscanf (dateString + 8,"%d",&(date->Day)) != 1) { CMmsgPrint (CMmsgAppError,"Error: Invalid date [%s] in: %s:%d",dateString,__FILE__,__LINE__); return (false); } date->DayOfYear += date->Day; return (true); }
int MFDateGetMonthLength () { return (_MFDateMonthLength (_MFCurrentDate.Year,_MFCurrentDate.Month)); }
int MFDateTimeStepLength (const char *timeStr, int timeStep) { int year, month, leapYear, monthLen; int nStep = 0; char scanStr [strlen (MFDateClimatologyYearStr) + 1]; switch (timeStep) { case MFTimeStepYear: if (strlen (timeStr) == 4) return (1); break; case MFTimeStepMonth: if (strlen (timeStr) == 7) return (1); break; case MFTimeStepDay: if (strlen (timeStr) == 10) return (1); break; case MFTimeStepHour: if (strlen (timeStr) == 13) return (1); break; } if (strncmp (timeStr,MFDateClimatologyYearStr,strlen (MFDateClimatologyYearStr)) == 0) { year = MFDefaultMissingInt; leapYear = 0; } else { strncpy (scanStr,timeStr,strlen (MFDateClimatologyYearStr)); scanStr [strlen (MFDateClimatologyYearStr)] = 0; if (sscanf (scanStr,"%d", &year) != 1) { CMmsgPrint (CMmsgUsrError,"Date scanning error in: %s:%d",__FILE__,__LINE__); return (0); } leapYear = _MFDateLeapYear (year); } if (strlen (timeStr) > strlen (MFDateClimatologyYearStr)) { strncpy (scanStr,timeStr + strlen (MFDateClimatologyYearStr) + 1,2); scanStr [2] = 0; if (sscanf (scanStr,"%d", &month) != 1) { CMmsgPrint (CMmsgUsrError,"Date scanning error in: %s:%d",__FILE__,__LINE__); return (0); } monthLen = _MFDateMonthLength(year,month); } switch (strlen (timeStr)) { case 4: switch (timeStep) { case MFTimeStepYear: nStep = 1; break; default: nStep = 0; break; } break; case 7: switch (timeStep) { case MFTimeStepYear: nStep = 12; break; case MFTimeStepMonth: nStep = 1; break; default: nStep = 0; break; } break; case 10: switch (timeStep) { case MFTimeStepYear: nStep = 365 + leapYear; break; case MFTimeStepMonth: nStep = monthLen; break; case MFTimeStepDay: nStep = 1; break; default: nStep = 0; break; } break; case 13: switch (timeStep) { case MFTimeStepYear: nStep = (365 + leapYear) * 24; break; case MFTimeStepMonth: nStep = monthLen * 24; break; case MFTimeStepDay: nStep = 24; break; case MFTimeStepHour: nStep = 1; break; default: nStep = 0; break; } break; } return (nStep); }