kewisch / ical.js

Javascript parser for ics (rfc5545) and vcard (rfc6350) data
https://kewisch.github.io/ical.js/
Mozilla Public License 2.0
998 stars 138 forks source link

Error in RecurExpansion (or sub-calls), doesn't output last iteration. #409

Closed Garfius closed 5 months ago

Garfius commented 4 years ago

I don't create ics files. I have started using this library to parse ical files from: Google, Microsoft, Unitime

All looked ok, until this showed up.

Thanks.

-----------The problem---------- Last ocurrence should be 20191021, as figures out, but only outputs this date if i change RRULE to next day.

Tried other inperpreters such like Outlook, and the event shows up.

The problematic event: ` BEGIN:VEVENT

DTSTART;TZID=Europe/Madrid:20190923T110000 DTEND;TZID=Europe/Madrid:20190923T123000 LOCATION:TF T119 STATUS:CONFIRMED RRULE:FREQ=WEEKLY;UNTIL=20191021T103000Z;BYDAY=MO;WKST=MO SEQUENCE:9 UID:96299574 SUMMARY:Documentar. 1 Reflexió pedagògica i tècniques de documentació DESCRIPTION:Teòrica Optativa B 3r curs\nLlop Jordana\, Irene\nVernis Llambi as\, Arnau DTSTAMP:20190916T110958Z ORGANIZER;CN="Llop Jordana, Irene":mailto: ATTENDEE;ROLE=CHAIR;CN="Vernis Llambias, Arnau":mailto: END:VEVENT `

Full ICS:

` BEGIN:VCALENDAR

VERSION:2.0 CALSCALE:GREGORIAN METHOD:PUBLISH X-WR-CALNAME: Schedule for 2019-20 2019 X-WR-TIMEZONE:Europe/Madrid PRODID:-//UniTime LLC/UniTime 4.2.185 Events//EN BEGIN:VEVENT DTSTART;TZID=Europe/Madrid:20190923T110000 DTEND;TZID=Europe/Madrid:20190923T123000 LOCATION:TF T119 STATUS:CONFIRMED RRULE:FREQ=WEEKLY;UNTIL=20191021T103000Z;BYDAY=MO;WKST=MO SEQUENCE:9 UID:96299574 SUMMARY:Documentar. 1 Reflexió pedagògica i tècniques de documentació DESCRIPTION:Teòrica Optativa B 3r curs\nLlop Jordana\, Irene\nVernis Llambi as\, Arnau DTSTAMP:20190916T110958Z ORGANIZER;CN="Llop Jordana, Irene":mailto: ATTENDEE;ROLE=CHAIR;CN="Vernis Llambias, Arnau":mailto: END:VEVENT BEGIN:VEVENT DTSTART;TZID=Europe/Madrid:20190923T123000 DTEND;TZID=Europe/Madrid:20190923T140000 LOCATION:TF T119 STATUS:CONFIRMED RRULE:FREQ=WEEKLY;UNTIL=20191021T120000Z;BYDAY=MO;WKST=MO SEQUENCE:3 UID:96299575 SUMMARY:Documentar. 2 Reflexió pedagògica i tècniques de documentació DESCRIPTION:Teòrica Optativa B 3r curs\nLlop Jordana\, Irene\nVernis Llambi as\, Arnau DTSTAMP:20190916T103100Z ORGANIZER;CN="Llop Jordana, Irene":mailto: ATTENDEE;ROLE=CHAIR;CN="Vernis Llambias, Arnau":mailto: END:VEVENT BEGIN:VEVENT DTSTART;TZID=Europe/Madrid:20190920T083000 DTEND;TZID=Europe/Madrid:20190920T103000 LOCATION:TF T119 STATUS:CONFIRMED RRULE:FREQ=WEEKLY;UNTIL=20191025T083000Z;BYDAY=FR;WKST=MO SEQUENCE:7 UID:96299573 SUMMARY:Documentar. 3 Reflexió pedagògica i tècniques de documentació DESCRIPTION:Teòrica Optativa B 3r curs\nLlop Jordana\, Irene\nVernis Llambi as\, Arnau DTSTAMP:20190916T110705Z ORGANIZER;CN="Llop Jordana, Irene":mailto: ATTENDEE;ROLE=CHAIR;CN="Vernis Llambias, Arnau":mailto: END:VEVENT BEGIN:VTIMEZONE TZID:Europe/Madrid TZURL:http://tzurl.org/zoneinfo/Europe/Madrid X-LIC-LOCATION:Europe/Madrid BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19810329T020000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT BEGIN:DAYLIGHT TZOFFSETFROM:+0000 TZOFFSETTO:+0100 TZNAME:WEST DTSTART:19180415T230000 RDATE:19180415T230000 RDATE:19190406T230000 RDATE:19240416T230000 RDATE:19260417T230000 RDATE:19270409T230000 RDATE:19280415T000000 RDATE:19290420T230000 RDATE:19370616T230000 RDATE:19380402T230000 END:DAYLIGHT BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:WEMT DTSTART:19380430T230000 RDATE:19380430T230000 END:DAYLIGHT BEGIN:DAYLIGHT TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:WEST DTSTART:19381002T235959 RDATE:19381002T235959 END:DAYLIGHT BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19420502T230000 RDATE:19420502T230000 RDATE:19430417T230000 RDATE:19440415T230000 RDATE:19450414T230000 RDATE:19460413T230000 RDATE:19490430T230000 RDATE:19740413T230000 RDATE:19750412T230000 RDATE:19760327T230000 RDATE:19770402T230000 RDATE:19780402T020000 RDATE:19790401T020000 RDATE:19800406T020000 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19961027T030000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 END:STANDARD BEGIN:STANDARD TZOFFSETFROM:-0014 TZOFFSETTO:+0000 TZNAME:WET DTSTART:19001231T234516 RDATE:19001231T234516 END:STANDARD BEGIN:STANDARD TZOFFSETFROM:+0100 TZOFFSETTO:+0000 TZNAME:WET DTSTART:19181007T005959 RDATE:19181007T005959 RDATE:19191007T005959 RDATE:19241005T005959 RDATE:19261003T005959 RDATE:19271002T005959 RDATE:19281007T005959 RDATE:19291006T005959 RDATE:19371003T005959 RDATE:19391008T005959 END:STANDARD BEGIN:STANDARD TZOFFSETFROM:+0000 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19400316T230000 RDATE:19400316T230000 END:STANDARD BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19420901T010000 RDATE:19420901T010000 RDATE:19431003T010000 RDATE:19441001T010000 RDATE:19450930T010000 RDATE:19460929T010000 RDATE:19491002T010000 RDATE:19741006T010000 RDATE:19751005T010000 RDATE:19760926T010000 RDATE:19770925T010000 RDATE:19781001T030000 RDATE:19790930T030000 RDATE:19800928T030000 RDATE:19810927T030000 RDATE:19820926T030000 RDATE:19830925T030000 RDATE:19840930T030000 RDATE:19850929T030000 RDATE:19860928T030000 RDATE:19870927T030000 RDATE:19880925T030000 RDATE:19890924T030000 RDATE:19900930T030000 RDATE:19910929T030000 RDATE:19920927T030000 RDATE:19930926T030000 RDATE:19940925T030000 RDATE:19950924T030000 END:STANDARD BEGIN:STANDARD TZOFFSETFROM:+0100 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19790101T000000 RDATE:19790101T000000 END:STANDARD END:VTIMEZONE END:VCALENDAR `

Garfius commented 4 years ago

Ok, sorted it out, and it's not simple.

Not sure if specified on the RFC, but...

UNTIL value from RRULE, should have the exact hour and minute from DTSTART, but it has 30 sooner time.

BUT!, other(most) software compares only year,month,day, not hour and minute.

----------implemented method works as follows-----------
7096 : icalrecur_iterator_next(){
...mode code...
7156 ; if (this.occurrence_number == 0 && this.last.compare(this.dtstart) >= 0) {  <-- uses 5345: compare: function icaltime_compare(other) {

Which uses 'toUnixTime' to compare dates(includes hour and minute)
---------suggested improvement/s------------------------
Option1:
  Use another comparing method tolerant to this kind of errors (not compare hour and minute).
Option2:
  Set hour and minute of UNTIL, to DTSTART values.

Well, i thought it was a bug, but it turned out to be intolerant to errors.

Anyway, thanks 4 the great work!

kewisch commented 5 months ago

Thanks for debugging! Indeed the spec would require exact dates. Other apps not comparing times seems to be a bug to me and could lead to unexpected issues the other way around. Apologies for just getting back now.