diff options
-rw-r--r-- | RecurringType.php | 63 | ||||
-rwxr-xr-x | SchedulerHelperDate.php | 14 |
2 files changed, 57 insertions, 20 deletions
diff --git a/RecurringType.php b/RecurringType.php index d26fb16..e8be50d 100644 --- a/RecurringType.php +++ b/RecurringType.php @@ -22,6 +22,13 @@ class RecurringType { const IS_RECURRING_EXCEPTION = ""; const IS_RECURRING_BREAK = "none"; + const TRANSPOSE_SIZE = array( + self::REC_TYPE_DAY => 1, + self::REC_TYPE_WEEK => 7, + self::REC_TYPE_MONTH => 1, + self::REC_TYPE_YEAR => 12 + ); + private $_fields_values = array(); private $_recurring_start_date_stamp; private $_recurring_end_date_stamp; @@ -158,7 +165,7 @@ class RecurringType { static private function _parseRecurringDataString($dataStr) { $formatPartsReg = "/(_|#)/"; - $formatDaysListPartReg = "/,/"; + $formatDaysListDelimiter = ","; $parsedData = array(); $parts = preg_split($formatPartsReg, $dataStr); @@ -175,8 +182,14 @@ class RecurringType { $parsedData[self::FLD_REPEAT] = $parts[5]; } - $parsedData[self::FLD_WEEK_DAYS_LIST] = ($parsedData[self::FLD_WEEK_DAYS_LIST]) ? - preg_split($formatDaysListPartReg, $parsedData[self::FLD_WEEK_DAYS_LIST]) : array(); + $days = $parsedData[self::FLD_WEEK_DAYS_LIST]; + + // $days is a comma separated week days string ("0,1,2"). Need an extra check for `every Sunday` series - "0" - which string is considered as falsy/empty in php + if(!empty($days) || $days === "0"){ + $parsedData[self::FLD_WEEK_DAYS_LIST] = explode($formatDaysListDelimiter, $days); + }else{ + $parsedData[self::FLD_WEEK_DAYS_LIST] = array(); + } return $parsedData; } @@ -229,32 +242,46 @@ class RecurringType { ); //Return recurring interval without correcting if it not belongs to assigned interval. - if(($intervalStartDateStamp >= $recurringEndDateStamp) || ($intervalEndDateStamp <= $recurringStartDateStamp)) + if (($intervalStartDateStamp >= $recurringEndDateStamp) || ($intervalEndDateStamp <= $recurringStartDateStamp)) return $recurringInterval; //Correct start date interval if it smaller then recurring start date. - if($intervalStartDateStamp < $recurringStartDateStamp) + if ($intervalStartDateStamp < $recurringStartDateStamp) $intervalStartDateStamp = $recurringStartDateStamp; //Correct end date interval if it smaller then recurring end date. - if($intervalEndDateStamp > $recurringEndDateStamp) + if ($intervalEndDateStamp > $recurringEndDateStamp) $intervalEndDateStamp = $recurringEndDateStamp; - $differenceStartDates = SchedulerHelperDate::differenceBetweenDates($intervalStartDateStamp, $recurringStartDateStamp); - $differenceEndDates = SchedulerHelperDate::differenceBetweenDates($intervalEndDateStamp, $recurringEndDateStamp); - $dateUnits = SchedulerHelperDate::$DATE_UNITS; + $type = $this->getRecurringTypeValue(); + //If recurring type is "year" then exit, else add months. + if ($type == self::REC_TYPE_DAY || $type == self::REC_TYPE_WEEK) { + $step = self::TRANSPOSE_SIZE[$type] * $this->getRecurringTypeStepValue(); + $day = 24 * 60 * 60; + $delta = floor(($intervalStartDateStamp - $recurringStartDateStamp) / ($day * $step)); + if ($delta > 0) + $recurringInterval["start_date_stamp"] = $recurringStartDateStamp + $delta * $step * $day; + } + else { + $differenceStartDates = SchedulerHelperDate::differenceBetweenDates($intervalStartDateStamp, $recurringStartDateStamp); + $differenceEndDates = SchedulerHelperDate::differenceBetweenDates($intervalEndDateStamp, $recurringEndDateStamp); + $dateUnits = SchedulerHelperDate::$DATE_UNITS; + + //Add years. + $recurringInterval["start_date_stamp"] = SchedulerHelperDate::addYears($recurringStartDateStamp, $differenceStartDates[$dateUnits["year"]]); + $recurringInterval["end_date_stamp"] = SchedulerHelperDate::addYears($recurringEndDateStamp, -$differenceEndDates[$dateUnits["year"]]); - //Add years. - $recurringInterval["start_date_stamp"] = SchedulerHelperDate::addYears($recurringStartDateStamp, $differenceStartDates[$dateUnits["year"]]); - $recurringInterval["end_date_stamp"] = SchedulerHelperDate::addYears($recurringEndDateStamp, -$differenceEndDates[$dateUnits["year"]]); - //If recurring type is "year" then exit, else add months. - if($this->getRecurringTypeValue() == self::REC_TYPE_YEAR) - return $recurringInterval; + if ($type == self::REC_TYPE_YEAR) + return $recurringInterval; + + //Add months. + $recurringInterval["start_date_stamp"] = SchedulerHelperDate::addMonths($recurringInterval["start_date_stamp"], $differenceStartDates[$dateUnits["month"]]); + $recurringInterval["end_date_stamp"] = SchedulerHelperDate::addMonths($recurringInterval["end_date_stamp"], -$differenceEndDates[$dateUnits["month"]]); + if ($type == self::REC_TYPE_MONTH) + return $recurringInterval; + } - //Add months. - $recurringInterval["start_date_stamp"] = SchedulerHelperDate::addMonths($recurringInterval["start_date_stamp"], $differenceStartDates[$dateUnits["month"]]); - $recurringInterval["end_date_stamp"] = SchedulerHelperDate::addMonths($recurringInterval["end_date_stamp"], -$differenceEndDates[$dateUnits["month"]]); return $recurringInterval; } diff --git a/SchedulerHelperDate.php b/SchedulerHelperDate.php index c1d3244..3993738 100755 --- a/SchedulerHelperDate.php +++ b/SchedulerHelperDate.php @@ -35,8 +35,10 @@ class SchedulerHelperDate static public function getDateTimestamp($date, $serverDate) { $parsedDate = date_parse($date); + + $timestamp = false; if ($serverDate) { - return gmmktime( + $timestamp = gmmktime( $parsedDate["hour"], $parsedDate["minute"], $parsedDate["second"], @@ -45,7 +47,7 @@ class SchedulerHelperDate $parsedDate["year"] ); } else { - return mktime( + $timestamp = mktime( $parsedDate["hour"], $parsedDate["minute"], $parsedDate["second"], @@ -54,6 +56,14 @@ class SchedulerHelperDate $parsedDate["year"] ); } + + // mktime/gmmktime returns FALSE for years after 2038 in 32bit PHP, so timestamps for end_dates of endless series will be false as well (usually defined as 9999/1/1). + // If $date is a valid date string and timestamp equals FALSE - assume that's it and give timestamp maximum possible value, so dates could be compared correctly later in code + if($timestamp === false && $parsedDate && !($parsedDate["error_count"])){ + $timestamp = PHP_INT_MAX; + } + + return $timestamp; } static public function getDayOfWeek($timestamp) { |