Return Type | Function name | Arguments |
---|---|---|
hzEcode | hzCron::Advance | (hzXDate&,unsigned int,) |
Declared in file: hzCron.h
Defined in file : hzCron.cpp
Function Logic:
Function body:
hzEcode hzCron::Advance (hzXDate& date, unsigned int factor) { _hzfunc("hzCron::Advance(hzXDate)") ; hzSDate fr ; hzSDate to ; hzSDate sd ; uint32_t Y ; uint32_t M ; uint32_t D ; uint32_t dow ; uint32_t alt ; bool bExcl ; if (!m_bActive) { date.Clear() ; m_error = "Interval not active" ; return E_RANGE ; } if (m_Period == HZPERIOD_NEVER) { date.Clear() ; m_error = "Interval has no periodicity" ; return E_RANGE ; } if (m_Period == HZPERIOD_INVALID) { date.Clear() ; m_error = "Interval has invalid periodicity" ; return E_RANGE ; } if (m_Period == HZPERIOD_RANDOM) { date.Clear() ; m_error = "Interval is chaotic" ; return E_RANGE ; } if (!factor) { m_error = "Factor must be 1 or more" ; return E_ARGUMENT ; } if (!date.IsSet()) date.SysDateTime() ; do { Y = date.Year() ; M = date.Month() ; D = date.Day() ; dow = date.Dow() ; if (m_Period == HZPERIOD_DAY) { alt = 1; date.altdate(DAY, alt) ; } // Mon - Sat", else if (m_Period == HZPERIOD_MONSAT) { alt = dow==5? 2: 1; date.altdate(DAY, alt) ; } // Weekdays only else if (m_Period == HZPERIOD_WEEKDAY) { alt = dow==4? 3: dow==5? 2: 1; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_EMON) { alt = 7-dow; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ETUE) { alt = dow==1? 7: dow<1? 1: 8-dow; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_EWED) { alt = dow==2? 7: dow<2? 2-dow: 9-dow; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ETHR) { alt = dow==3? 7: dow<3? 3-dow: 10-dow;date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_EFRI) { alt = dow==4? 7: dow<4? 4-dow: 11-dow;date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ESAT) { alt = dow==5? 7: dow<5? 5-dow: 6; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ESUN) { alt = dow==6? 7: 6-dow; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ALT_MON) { alt = 7-dow; alt += 7; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ALT_TUE) { alt = dow==1? 7: dow<1? 1: 8-dow; alt += 7; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ALT_WED) { alt = dow==2? 7: dow<2? 2-dow: 9-dow; alt += 7; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ALT_THR) { alt = dow==3? 7: dow<3? 3-dow: 10-dow;alt += 7; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ALT_FRI) { alt = dow==4? 7: dow<4? 4-dow: 11-dow;alt += 7; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ALT_SAT) { alt = dow==5? 7: dow<5? 5-dow: 6; alt += 7; date.altdate(DAY, alt) ; } else if (m_Period == HZPERIOD_ALT_SUN) { alt = dow==6? 7: 6-dow; alt += 7; date.altdate(DAY, alt) ; } else { switch (m_Period) { case HZPERIOD_MONTH: M++ ; break ; case HZPERIOD_MONTH1: case HZPERIOD_MONTH2: alt = M % 2; M += alt ? alt : 2; break ; case HZPERIOD_QTR1: case HZPERIOD_QTR2: case HZPERIOD_QTR3: alt = M % 3; M += alt ? alt : 3; break ; case HZPERIOD_HYEAR1: case HZPERIOD_HYEAR2: case HZPERIOD_HYEAR3: case HZPERIOD_HYEAR4: case HZPERIOD_HYEAR5: case HZPERIOD_HYEAR6: alt = M % 6; M += alt ? alt : 6; break ; case HZPERIOD_YEAR1: case HZPERIOD_YEAR2: case HZPERIOD_YEAR3: case HZPERIOD_YEAR4: case HZPERIOD_YEAR5: case HZPERIOD_YEAR6: case HZPERIOD_YEAR7: case HZPERIOD_YEAR8: case HZPERIOD_YEAR9: case HZPERIOD_YEAR10: case HZPERIOD_YEAR11: case HZPERIOD_YEAR12: Y++ ; break ; } if (M > 12) { Y++ ; M -= 12;} date.SetDate(Y, M, 1); } bExcl = false ; if (m_frMth) { sd.SetDate(date.Year(), date.Month(), date.Day()) ; fr.SetDate(date.Year(), m_frMth, m_frDay) ; to.SetDate(date.Year(), m_toMth, m_toDay) ; if (sd >&eq; fr && sd <&eq; to) bExcl = true ; } if (!m_frMth && m_toMth) { if (M == m_toMth && D == m_toDay) bExcl = true ; } if (IsHoliday(date, m_exclhols)) bExcl = true ; if (!bExcl) factor-- ; } while (factor) ; return E_OK ; }