Skip to content

rrule.js vs dateutil.rrule #807

@freenetwork

Description

@freenetwork
import arrow
from dateutil.rrule import rrule, rruleset, rrulestr
from dateutil.parser import *
FREQNAMES = ['YEARLY','MONTHLY','WEEKLY','DAILY','HOURLY','MINUTELY','SECONDLY']
WEEKDAYS = ['MO','TU','WE','DH','FR','SA','SU']

def rruleset_from_str(rrule_str):
    """convert string from nodejs rrule module to acceptable string for rrulestr
    and return rruleset object """
    # print (rrule_str)
    rules = rrule_str.split(';')
    # print (rules)
    clear_rules = []
    dtstart = None
    for i, rule in enumerate(rules):
        if "DTSTART" in rule or "dtstart" in rule:
            dtstart = rule
        elif "COUNT" in rule:
            if rule.split('=')[1]!='0':
                clear_rules.append(rule)
        else:
            clear_rules.append(rule)
    correct_rules = ';'.join(clear_rules)
    # print (clear_rules)
    if dtstart:
        fix_date = None
        try:
            fix_date = arrow.get(dtstart.split('=')[1].rstrip('Z'),'YYYYMMDDTHHmmss')
        except:
            fix_date = arrow.get(dtstart.split(':')[1].rstrip('Z'),'YYYYMMDDTHHmmss')
        correct_rules = 'DTSTART:{}\n'.format(fix_date.format('YYYYMMDDTHHmmssZ')) +"RRULE:"+ correct_rules
    # print (correct_rules)    
    rr_set = rrulestr(correct_rules, forceset=True)
    return rr_set
    
if __name__=='__main__':
    rr = rruleset_from_str("FREQ=WEEKLY;DTSTART=20120201T093000Z;INTERVAL=5;UNTIL=20130130T230000Z;BYDAY=MO,FR")
    print(rr)
    print(rr._rrule[0])
    print(rr._rrule[0].__dict__)

MY EVENT:
user in +07:00
event from 6.30 in TU
i save in utc, but day it same

MY RRULE: "FREQ=WEEKLY;BYDAY=TU;INTERVAL=1;DTSTART=20171106T234500Z;UNTIL=20221106T234500Z"

MY BEETWEN: from 2018-08-27 00:00:00.000+07:00 to 2018-08-20 00:00:00.000+07:00

var rrule = new RRule.fromString("FREQ=WEEKLY;BYDAY=TU;INTERVAL=1;DTSTART=20171106T234500Z;UNTIL=20221106T234500Z")
var beetween = rrule.between(moment("2018-08-27 00:00:00.000+07:00").toDate(), moment("2018-08-20 00:00:00.000+07:00").toDate())
console.log(beetween)

on rrule.js i get
[ 2018-08-20T23:45:00.000Z ]

q = "FREQ=WEEKLY;BYDAY=TU;INTERVAL=1;DTSTART=20171106T234500Z;UNTIL=20221106T234500Z"
r = rruleset_from_str(q)
t = r.between(arrow.get("2018-08-20 00:00+07:00").datetime,arrow.get("2018-08-27 00:00+07:00").datetime)
print (t)

on dateutil.rrule i get
[datetime.datetime(2018, 8, 21, 23, 45, tzinfo=tzutc())]

JS IS BAD
But it works for me. How to do the same on dateuti.rrule
How to do the same thing on Python as well as on JS

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions