simshaun / recurr

PHP library for working with recurrence rules (RRULE); meant to help with recurring calendar events.
Other
1.21k stars 136 forks source link

Modify instead Add inside ArrayTransformer. #193

Open Gu3 opened 3 years ago

Gu3 commented 3 years ago

Hi ! I've got an use case who make an error inside the ArrayTranformer.

Imagine this Rule :

Rule {#11684 
  #timezone: "Europe/Paris"
  #startDate: DateTime {#9670 
    +"date": "2021-07-01 00:00:00.000000"
    +"timezone_type": 3
    +"timezone": "Europe/Paris"
  }
  #endDate: DateTime {#9666 
    +"date": "2021-09-06 00:00:00.000000"
    +"timezone_type": 3
    +"timezone": "Europe/Paris"
  }
  #isStartDateFromDtstart: false
  #freq: 3
  #interval: 1
  #isExplicitInterval: false
  #until: null
  #count: 1
  #bySecond: null
  #byMinute: null
  #byHour: null
  #byDay: null
  #byMonthDay: null
  #byYearDay: null
  #byWeekNumber: null
  #byMonth: null
  #weekStart: "MO"
  #weekStartDefined: false
  #days: array:7 [▶]
  #bySetPosition: null
  #rDates: []
  #exDates: []
}

The duration interval give us :

$start = $rule->getStartDate();
$end   = $rule->getEndDate();
$durationInterval = $start->diff($end);   //  2 months and 6 days ==> 67 days 

the add method give us :

$end->add($durationInterval); // september 7th instead of september 6th

if we used modify instead of add :

$end->modify(sprintf("+ %s day" . ($durationInterval->days == 1 ? '' : 's'), $durationInterval->days)); // september 6th

For a full explanation : https://aiocollective.com/blog/php-datetime-difference-trap/

Is that correct for you too ? Cheer ! Vincent.