Package: cron-converter
Cron-converter provides a Cron string parser ( from string/lists to string/lists ) and iteration for the datetime object with a cron like format.This project would be a transposition in Python of JScron-converterbyroccivic.InstallPippipinstallcron-converterUsefromcron_converterimportCronCreate a new instancecron_instance=Cron()orcron_instance=Cron('*/10 9-17 1 * *')or (with constructor options)cron_instance=Cron('*/10 9-17 1 * *',{'output_weekday_names':True,'output_month_names':True})Parse a cron string# Every 10 mins between 9am and 5pm on the 1st of every month# In the case of the second or third creation method this step is not requiredcron_instance.from_string('*/10 9-17 1 * *')# Prints: '*/10 9-17 1 * *'print(cron_instance.to_string())# Alternatively, you could print directly the object obtaining the same result:# print(cron_instance) # Prints: '*/10 9-17 1 * *'# Prints:# [#   [ 0, 10, 20, 30, 40, 50 ],#   [ 9, 10, 11, 12, 13, 14, 15, 16, 17 ],#   [ 1 ],#   [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ],#   [ 0, 1, 2, 3, 4, 5, 6 ]# ]print(cron_instance.to_list())Parse an Arraycron_instance.from_list([[0],[1],[1],[5],[0,2,4,6]])# Prints: '0 1 1 5 */2'print(cron_instance.to_string())Constructor optionsPossible options:output_weekday_names: false (default)output_month_names: false (default)output_hashes: false (default)output_weekday_names and output_month_namescron_instance=Cron(None,{'output_weekday_names':True,'output_month_names':True})cron_instance.from_string('*/5 9-17/2 * 1-3 1-5')# Prints: '*/5 9-17/2 * JAN-MAR MON-FRI'print(cron_instance)orcron_instance=Cron('*/5 9-17/2 * 1-3 1-5',{'output_weekday_names':True,'output_month_names':True})# Prints: '*/5 9-17/2 * JAN-MAR MON-FRI'print(cron_instance)output_hashescron_instance=Cron('*/5 9-17/2 * 1-3 1-5',{'output_hashes':True})# Prints: 'H/5 H(9-17)/2 H 1-3 1-5'print(cron_instance.to_string())Get the schedule execution times. Example with raw Datetime# Parse a string to init a schedulecron_instance.from_string('*/5 * * * *')# Raw datetime without timezone info (not aware)reference=datetime.now()# Get the iterator, initialised to nowschedule=cron_instance.schedule(reference)# Calls to .next() and .prev()# return a Datetime object# Examples with time now: '2021-01-01T09:32:00# Prints: '2021-01-01T09:35:00'print(schedule.next().isoformat())# Prints: '2021-01-01T09:40:00'print(schedule.next().isoformat())# Resetschedule.reset()# Prints: '2021-01-01T09:30:00'print(schedule.prev().isoformat())# Prints: '2021-01-01T09:25:00'print(schedule.prev().isoformat())About DSTBe sure to init your cron-converter instance with a TZ aware datetime for this to work!A Scheduler has two optional mutually exclusive arguments:start_dateortimezone_str.
By default (no parameters), a Scheduler start count with a UTC datetime (utcnow()) if you not specify anystart_datedatetime object.
If you providetimezone_strthe Scheduler will start count from a localized now datetime (datetime.now(tz_object)).Example starting from localized now datetimefromcron_converterimportCroncron=Cron('0 0 * * *')schedule=cron.schedule(timezone_str='Europe/Rome')# Prints: result datetime + utc offsetprint(schedule.next())Example using pytz:frompytzimporttimezonefromdatetimeimportdatetimefromcron_converterimportCrontz=timezone('Europe/Rome')local_date=tz.localize(datetime(2021,1,1))cron=Cron('0 0 * * *')schedule=cron.schedule(start_date=local_date)next_schedule=schedule.next()next_next_schedule=schedule.next()# Prints: '2021-01-01T00:00:00+01:00'print(next_schedule.isoformat())# Prints: '2021-01-02T00:00:00+01:00'print(next_next_schedule.isoformat())Example using python_dateutil:importdateutil.tzfromdatetimeimportdatetimefromcron_converterimportCrontz=dateutil.tz.gettz('Asia/Tokyo')local_date=datetime(2021,1,1,tzinfo=tz)cron=Cron('0 0 * * *')schedule=cron.schedule(start_date=local_date)next_schedule=schedule.next()next_next_schedule=schedule.next()# Prints: '2021-01-01T00:00:00+09:00'print(next_schedule.isoformat())# Prints: '2021-01-02T00:00:00+09:00'print(next_next_schedule.isoformat())About Cron schedule times frequencyIt's possible to compare the Cron object schedules frequency. Thanks@zevaverbach.# HoursCron('0 1 * * 1-5')==Cron('0 2 * * 1-5')# TrueCron('0 1,2,3 * * 1-5')>Cron('0 1,23 * * 1-5')# True# MinutesCron('* 1 * * 1-5')==Cron('0-59 1 * * 1-5')# TrueCron('1-30 1 * * 1-5')>Cron('1-29 1 * * 1-5')# True# DaysCron('* 1 1 * 1-5')==Cron('0-59 1 2 * 1-5')# TrueCron('* 1 1,2 * 1-5')>Cron('* 1 6 * 1-5')# True# MonthCron('* 1 1 11 1-5')==Cron('* 1 1 1 1-5')# TrueCron('* 1 6 * 1-5')>Cron('* 1 6 1 1-5')# True# WeekDayCron('* 1 1 11 *')==Cron('* 1 1 11 0-6')# TrueCron('* 1 6 * 1-5')>Cron('* 1 6 * 1-4')# TrueAbout seconds repeatsCron-converter is NOT able to do second repetition crontabs form.Develop & Testsgitclonehttps://github.com/Sonic0/cron-convertercdcron-converter
...
python-munittestdiscover-stests/unit
python-munittestdiscover-stests/integrationProject infoThis repo is part of a projects group, calledCron-Converter.
Its related repositories:local-crontablocal-crontab-ansible-filterlocal-crontab-serverless-infrastructurelocal-crontab-web-converter