summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--RecurringType.php63
-rwxr-xr-xSchedulerHelperDate.php14
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) {