Schedule Syntax
===============

     [!] <timeranges> [<days> [<weeks> [<months>]]]

     !
        desc: exclusion pattern. ommiting the ! implies an inclusion
              pattern

     <timeranges> := <timerange>[,<timerange>]
       <timerange> := <begin>:<end>@<interval>
          <begin> <end> := <hour>:<minute>
          <interval>
            type: duration expression (default unit: minutes)

     <days> := <day>[-<day>][,<day>[-<day>]]
        <day> := <day_of_week>[:<day_of_month>]
          <day_of_week>
             * iso week day format
               type: integer between 0 and 6
             * literal format
               type: string in ("mon", "tue", "wed", "thu", "fri", "sat",
                     "sun", "monday", "tuesday", "wednesday", "thursday",
                     "friday", "saturday", "sunday")
          <day_of_month> := <literal> | +<nth> | -<nth> | <nth>
             <nth>
               type: integer
             <literal>
               type: string in ("first", "1st", "second", "2nd", "third",
                     "3rd", "fourth", "4th", "fifth", "5th", "last")

     <weeks> := <week>[-<week>][,<week>[-<week>]]
        <week>
          type: integer between 1 and 53

     <months> := <monthrange>[,<monthrange>]
        <monthrange> := <month>[-<month>] | <month_filter>
          <month>
            * numeric month format
              type: integer between 1 and 12
            * literal format
              type: string in ("jan", "feb", "mar", "apr", "may", "jun",
                    "jul", "aug", "sep", "oct", "nov", "dec", "january",
                    "february", "march", "april", "may", "june", "july",
                    "august", "september", "october", "november",
                    "december")
          <month_filter> := %<modulo>[+<shift>]
            <modulo>
              type: integer
            <shift>
              type: integer

Examples
--------

* schedule = 16:00-17:00@1m sat:last,tue-mon:last * %2+1,feb-apr

  reads as "once a minute between 16:00 and 17:00 on last monday,
  tuesday and saturday of every even months plus february and
  april".

* schedule = ["06:00-07:00@1h *:1,-1", "! * * * feb"]

  reads as "once between 6 and 7am every first and last day of every
  month except february".

