Grammatik für Timedomain-Werte (Dezember 2010)

  • Diese Version 2 weicht teilweise von der Spezifikation im Wiki ab, um eindeutige Auswertung zu gewährleisten.
  • Deckt alle Werte aus der OSM-Datenbank (Stand 31.01.2011) ab, soweit überhaupt formalisierbar.
  • Die sehr häufigen ergänzenden Bemerkungen werden als "…"-Kommentar abgebildet.
  • Ist eindeutig und hinreichend einfach™ auszuwerten.

Erklärung zur Schreibweise:

  • | kennzeichnet Alternativen.
  • [ und ] markieren optionale Komponenten.
  • { und } markieren optionale auch mehrfache Wiederholung.
  • Mehrere Produktionen zu einem Symbol bezeichnen Alternativen.
Symbol Definition Kommentar
time_domain
<time_domain> <rule_sequenz> { ## <rule_sequenz> } [1]
<rule_sequence> [ <days> : ] <rules> { ; <days> : <rules> } [2]
<rules> <rule> { ; <rule> }
Rule
<rule> <times_for_days> { , <times_for_days> } [3]
<times_for_days> 24/7 → open
<days> <times> → open
<days> <times> open [ <comment> ]
<days> <times> closed [ <comment> ] → closed
<days> <times> unknown [ <comment> ] → unknown
<days> off exception
<comment> → unknown
<comment> " … Zeichen außer ""
Days
<days> <day_list> { <day_list> } [4]
<day_list> <day_range> { , <day_range> } or
<day_range> daily every day
<day_of_week> every week
[5]
<day_of_week> - <day_of_week>
<monthly_date> every month
[6]
<monthly_date> - <monthly_date>
<yearly_date> every year
[7]
<yearly_date> - <yearly_date>
<month> every year
[8]
<month> - <month>
week <week_of_year> every year
[9]
week <week_of_year> - <week_of_year>
week <week_of_year> - <week_of_year> / <number>
[ <offset_days> ] <holiday> every year [10]
<fixed_date> once
[11]
<fixed_date> - <fixed_date>
<fixed_date> +
<monthly_date> [ <offset_days> ] <week_of_month> <day_of_week>
[ <offset_days> ] [ <offset_wday> ] <day_of_month>
<yearly_date> [ <offset_days> ] [ <offset_wday> ] <day_of_month> <month>
[ <offset_days> ] [ <offset_wday> ] <month> <number>
[ <offset_days> ] [ <offset_wday> ] <number> ↑[12]
[ <offset_days> ] <week_of_month> <day_of_week> in <month>
[ <offset_days> ] easter [13]
<offset_days> <number> days after
<number> days before
<offset_wday> <day_of_week> after
<day_of_week> before
<day_of_week> Su | Mo | Tu | We | Th | Fr | Sa | Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday
<week_in_month 1. | 2. | 3. | 4. | 1st | 2nd | 3rd | 4th | last
<month> Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | January | February | March | April | May | June | July | August | September | October | November | December |
<day_of_month> DD. DD∊{1..31}
<fixed_date> DD.MM.YYYY DD∊{1..31}
MM∊{1…12}
YYYY≥2000
YYYY-MM-DD
<week_of_year> WW WW∊{1..53}
Times
<times> <timespan> { , <timespan> } or
<timespan> <time> [14]
<time> - <time> [15]
<time> - <time> / <minute> [16]
<time> - <time> / <hh_mm>
<time> +
<time> - <time> + [17]
<time> <hh_mm>
[ <offset_time> ] sunrise [18]
[ <offset_time> ] sunset
<offset_time> <hh_mm> after
<hh_mm> before
<hh_mm> HH:MM HH∊{0..24}
MM∊{0…59}
  1. Die Gruppen werden von links nach rechts ausgewertet, bis eine Gruppe open als Ergebnis liefert. Dies drückt Öffnungszeiten mit abnehmender Qualität aus; Hauptanwendung sind zur Zeit die Bereitschaftszeiten von Apotheken.
    In der Diskussion wurde ! als Nicht-Operator vorgeschlagen; gemeint war aber offensichtlich ein Kurzschluß-Oder. Ich habe versuchsweise das aus vielen Programmiersprachen bekannte || eingeführt. Dies erwies sich aber als verwirrend, weil || in den Programmiersprachen stärker bindet als das ;, hier aber schwächer.
    Deshalb habe ich auf ## umgestellt.
  2. Eine <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.
    Nach einem <days> : werden die folgenden <rule>s nur dann berücksichtigt, wenn der aktuelle Tag in den <days> enthalten ist.
    Damit lassen sich z.B. bei einem Fahrplan Regeln auf die Gültigkeitsdauer des Fahrplans beschränken.
  3. Die Komponenten einer <rule> sind kooperativ: das Komma zwischen den Komponenten steht für und außerdem. Wenn ein Tag in mindestens einer der <times_for_days> enthalten ist, so ist diese <rule> für diesen Tag zuständig.
    In der OSM-Datenbank gibt es sehr häufig Angaben der Form 08:00-16:00. Diese wurden zu jeden Tag ausgewertet, was in den wenigsten Fällen gemeint ist. Zur Qualitätssicherung ist deshalb die Tagesangabe nicht mehr optional: wenn wirklich täglich gemeint ist, wird das durch daily ausgedrückt.
    In der OSM-Datenbank gibt es sehr häufig Angaben der Form Mo-Fr. Diese wurden zu 00:00-24:00 ausgewertet, was in den wenigsten Fällen gemeint ist. Zur Qualitätssicherung ist deshalb die Zeitangabe nicht mehr optional: wenn wirklich 0:00-24:00 gemeint ist, soll das auch angegeben werden.
  4. Die Regel ist zuständig für einen Tag, wenn dieser Tag in allen <day_list> enthalten ist.
  5. Weekwrap: es gibt keinen ersten Wochentag, sondern die Tage sind zyklisch geordnet: Fr-Mo ist ebenso zulässig wie Mo-Fr.
  6. Monthwrap: wenn das zweite Datum vor dem ersten liegt, wird es in den nächsten Monat verschoben. Damit sind monatsübergreifende Tagesbereiche möglich.
  7. Yearwrap: wenn das zweite Datum vor dem ersten liegt, wird es in das nächste Jahr verschoben. Damit sind jahresübergreifende Tagesbereiche möglich.
  8. Yearwrap: wenn der zweite Monat vor dem ersten liegt, wird er in das nächste Jahr verschoben. Damit sind jahresübergreifende Tagesbereiche möglich.
  9. Diese Schreibweise ist an die crontab angelehnt und erlaubt Ausdrücke wie in geraden Wochen.
  10. PH, SH, und BH: Ferien und Urlaubszeiten sind regional unterschiedlich geregelt. Ich brauche Zusatzinformationen, um die passenden Regeln zu bestimmen; dafür gibt es innerhalb OSM noch kein Konzept. Eine Möglichkeit wäre, aus den Koordinaten die Region zu bestimmen, eine andere, die Region explizit anzugeben: zum Beispiel SH(de.nrw) für die Schulferien in Nordrhein-Westfalen.
    Zu PH habe ich die Regeln für Deutschland und Österreich hinterlegt, diese werden durch eine addr:country Angabe am jeweiligen Objekt aktiviert.
  11. Bis auf weiteres: bei der Schreibweise mit + beginnt die Gültigkeit am angegebenen Tag und gilt bis auf weiteres.
  12. Implementiert die häufige Schreibweise May 1-10.
  13. Hier können bei Bedarf bewegliche Feiertage anderer Kulturräume ergänzt werden.
  14. Daywrap: wenn die zweite Zeitangabe vor der ersten liegt, so gilt sie für den folgenden Tag. Eine Uhrzeit liegt in dem angegebenen Bereich, wenn erste Zeitangabe ≤ zu prüfende Zeit < zweite Zeitangabe gilt.
  15. Einzelzeitpunkt: diese Schreibweise ist nur für collection_times und service_times sinnvoll.
  16. Taktung: 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.
  17. Open end: es wird die Mindestöffnungszeit angegeben.
  18. Helligkeitsbezogene Zeitangaben: diese Zeiten lassen sich aus Datum und Positionsangabe berechnen. Ich war aber zu faul, die Regeln nach JavaScript und Java zu portieren. Das wird nachgeholt, sobald ich einmal hinreichend große Langeweile habe – oder wenn jemand danach fragt. Zur Zeit setze ich 06:00 bzw. 18:00 ein.