Grammatik für Timedomain-Werte

  • Ist mit den Beispielen aus dem Wiki (bis auf die obligatorische Zeit) verträglich.
  • Deckt alle bereits erfassten Werte (soweit überhaupt formalisierbar) ab.
  • Die sehr häufigen ergänzenden Bemerkungen werden als "…"-Kommentar abgebildet.
  • Ist hinreichend einfach™ auszuwerten.

Erklärung zur Schreibweise:

  • | kennzeichnet Alternativen.
  • [ und ] markieren optionale Komponenten.
  • { und } markiert optionale auch mehrfache Wiederholung.
  • Mehrere Produktionen zu einem Symbol bezeichnen Alternativen.
Symbol Definition Kommentar
time_domain
<time_domain> 24/7 → open
<fallback_group> { || <fallback_group> } [1]
<fallback_group> <rule_sequence> { ; <rule_sequence> }
<rule_sequence> [ <calendar_ranges> : ] <basic_rule> { ; <basic_rule> } [2]
Basic rule
<basic_rule> <times_for_days> { , <times_for_days> } [3]
<times_for_days> open [ <comment> ] → open
closed [ <comment> ] → closed
unknown [ <comment> ] → unknown
<comment>
<day_list> off → closed
[ <day_list> ] <times> → open
[ <day_list> ] <times> open [ <comment> ]
[ <day_list> ] <times> closed [ <comment> ] → closed
[ <day_list> ] <times> unknown [ <comment> ] → unknown
[ <day_list> ] <times> <comment>
Days
<day_list> <day_or_days> { , <day_or_days> } or
<day_or_days> [ <weeks> ] { <holiday> } <days>
[ <weeks> ] { <holiday> } <holiday> [ ± <number> days ]
<holiday> SH | PH
<days> <wday> [4]
<wday> - <wday>
<wday> [ <nth_entry> { , <nth_entry> } ]
<mday>
<mday> - <mday>
<mday> - <mday> / <number> [5]
<nth_entry> <nth>
<nth> - <nth>
- <nth>
<nth> 1 | 2 | 3 | 4 | 5
<weeks> week <week> { , <week> } or
<week> <weeknum>
<weeknum> - <weeknum>
<weeknum> - <weeknum> / <number> [5]
Times
<times> <timespan> { , <timespan> } or
<timespan> <time>
<time> + [6]
<time> - <time> [7]
<time> - <time> +
<time> - <time> / <minute> [8]
<time> - <time> / <hour_minutes>
<time> <hour_minutes> | <variable_time>
<variable_time> <event>
<event> + <hour_minutes> hours
<event> - <hour_minutes> hours
<event> sunrise | sunset | …
Calendar
<calendar_ranges> <calendar_days> { , <calendar_days> } or
<comment> [9]
<calendar_days> [ <year> ] <month>
[ <year> ] <month> - <month>
[ <year> ] summer [10]
[ <year> ] winter
<date_with_offsets> [11]
<date_with_offsets> + [12]
<date_with_offsets> - <date_with_offsets> [13]
<date_with_offsets> <date> [ ± <wday> ] [ ± <number> days ] [14]
<date> [ <year> ] <month> <daynum>
[ <year> ] <month> <wday> [ [-] <nth> ]
[ <year> ] <variable_date>
<daynum> [15]
<variable_date> easter | …
Basic elements
<wday> Su | Mo | Tu | We | Th | Fr | Sa
<weeknum> 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53
<month> Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
<daynum> 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31
<mday> 01. | 02. | 03. | 04. | 05. | 06. | 07. | 08. | 09. | 10. | 11. | 12. | 13. | 14. | 15. | 16. | 17. | 18. | 19. | 20. | 21. | 22. | 23. | 24. | 25. | 26. | 27. | 28. | 29. | 30. | 31.
<hour_minutes> <hour>:<minute>
<hour> 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24
<minute> 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60
<comment> " {Zeichen außer " und ;} "
  1. Die Gruppen werden von links nach rechts ausgewertet, bis eine Gruppe open als Ergebnis liefert.

    In der Diskussion wurde ! als Nicht-Operator vorgeschlagen; gemeint war aber offensichtlich ein Kurzschluß-Oder.
    Ich habe versuchsweise das || eingeführt: man tippt es nicht "aus Versehen", es zeigt typografisch sehr gut die Zäsur, und jeder Programmierer versteht die Bedeutung sofort.

  2. Eine basic_rule ist entweder ganz für einen Tag zuständig oder gar nicht. Das Ergebnis einer rule_sequenz ist das Ergebnis der letzten Rule, die für den gegebenen Tag zuständig ist.
  3. Die Komponenten einer basic_rule sind kooperativ: das Komma zwischen den Komponenten steht für und außerdem.
  4. Su steht für alle Sonntage, Su[1] steht für den ersten Sonntag jedes Monats, Su[-1] steht für den letzten Sonntag jedes Monats.
  5. Diese Schreibweise ist an die crontab angelehnt und erlaubt Ausdrücke wie in geraden Wochen oder an ungeraden Tagen.
  6. Open end: die Öffnungszeit beginnt am angegebenen Zeitpunkt, das Ende ist nicht angegeben. Diese Angaben sind in der Praxis häufig; aber natürlich lässt sich nicht automatisiert feststellen, ob zu einem bestimmten Zeitpunkt geöffnet sein wird. Ich interpretiere diese Schreibweise als plus 4 Stunden, aber längstens bis Mitternacht.
  7. Wenn die zweite Zeitangabe vor der ersten liegt, so gilt sie für den folgenden Tag.
    Die Bedingung ist true, wenn erste Zeitangabe ≤ zu prüfende Zeit < zweite Zeitangabe gilt.
  8. Dieser Schreibweise definiert einen Takt: 10:00-16:00/90 und 10:00-16:00/1:30 stehen für von zehn bis vier alle 1½ Stunden. Damit lassen sich insbesonders Abfahrtszeiten kompakt und übersichtlich ausdrücken. Bei Öffnungszeiten wird der Takt ignoriert.
  9. Manchmal kann man den Öffnungszeitraum (noch) nicht formal spezifizieren.
    Dann nimmt ein von einem : gefolgter Kommentar die textuelle Beschreibung auf.
  10. Sehr oft wird bei Öffungszeiten zwischen Winter und Sommer unterschieden. Das werden mit den Pseudotagesbereichen summer und winter codiert: summer wird ausgewertet zu Mai–Oktober, winter zu November–April.
  11. Wenn das zu prüfende Datum mit dem angegebenen Tag übereinstimmt, true, sonst false.
  12. Bis auf weiteres: die Gültigkeit beginnt am angegebenen Tag und gilt bis auf weiteres.
  13. Wenn von-Tag ≤ zu prüfendes Datum ≤ bis-Tag gilt, ist das Ergebnis true.
    Wenn von-Tag > bis-Tag und außerdem das zu prüfende Datum ≤ von-Tag oder zu prüfendes Datum ≧ bis-Tag gilt und kein Jahr angegeben ist, ist das Ergebnis true.
    Sonst ist das Ergebnis false.
  14. Gegeben sei ein Kalendertag. Mit der Schreibweise + Su wird der erste Sonntag nach dem gegebenen Kalendertag bezeichnet. Mit der Schreibweise - Su wird der späteste Sonntag vor dem gegebenen Kalendertag bezeichnet.
  15. Steht ein Tag ohne Monat, wird der zuletzt im Ausdruck aufgetretene Monat angenommen.
  16. Bei closed und off bin ich mir nicht im Klaren: gleiche Bedeutung oder off nur für Ausnahmetage zulassen?

There is an english translation.