'How to exclude date in RRule.js?

Suspected code:

<script src="https://jakubroztocil.github.io/rrule/dist/es5/rrule.min.js"></script>
// Create a rule:
        const rule = new rrule.RRule({
            freq: rrule.RRule.DAILY,
            dtstart: new Date('{{ date('Y-m-d', strtotime($product->details->date_from . ' -1 day'))}}'),
            until: new Date('{{$product->details->date_to_1 ? date('Y-m-d', strtotime($product->details->date_to_1 . ' +1 day'))  : date('Y-m-d', strtotime($product->details->date_to . ' +1 day'))}}'),
        });

        rule.exdate(new Date("2020-06-25"));

Console got that:

TypeError: rule.exdate is not a function

But if we follow the official guide RRule repo manual

We can observe the solution as :)

// Add a exclusion date to rruleSet
rruleSet.exdate(new Date(Date.UTC(2012, 5, 1, 10, 30)))

I'm unable to figured it out where am i wrong ?

Thanks in advance.

Regards,
Aizaz



Solution 1:[1]

const rruleSet = new RRuleSet();
rruleSet.rrule(
  new RRule({
    freq: RRule.DAILY,
    count: 5,
    dtstart: new Date("Aug 2020 10 10:30 am"),
  })
);
rruleSet.exdate(new Date("Aug 2020 12 10:30 am"));

Here, it will exclude 12th Aug and gives back (10,11,13,14 of Aug).

Solution 2:[2]

RRuleSet is a different object to RRule. You will find exdate on the RRuleSet object and not on the RRule.

  1. Create a RRuleSet
  2. Add add your RRule
  3. Add your exclusion on the RRuleSet

Solution 3:[3]

The EXDATE prop will only work in RRuleSet. So, after including rrule.js script, you can exclude a single date or multiple dates like this:

const RRuleSet = rrule.RRuleSet;
const rruleSet = new RRuleSet();

rruleSet.rrule(
  new RRule({
    freq: RRule.DAILY,
    count: 5,
    dtstart: new Date("2022-04-15"),
  })
);

rruleSet.exdate(new Date("2022-04-25"));

// Again add 'exdate()' to exclude another date
rruleSet.exdate(new Date("2022-04-28"));

After that, convert rruleSet into string using toString()

let rruleStr = rruleSet.toString();

So, to check recurrence you should first convert rruleStr string to object using rrulestr() and than iterate rule using all(), before(), after() or between() retrival methods:

let ruleSetObj = rrule.rrulestr(rruleStr);
let ruleNextOccurrence = ruleSetObj.after(new Date('2022-04-25'), true);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 David Buck
Solution 2 Piotr Stulinski
Solution 3 Tayyab Chaudhary