- 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} |
- Die Gruppen werden von links nach rechts ausgewertet,
bis eine Gruppe
als Ergebnis liefert. Dies drückt Öffnungszeiten mit abnehmenderopen
Qualität
aus; Hauptanwendung sind zur Zeit dieBereitschaftszeiten
von Apotheken.
In der Diskussion wurde!
alsNicht
-Operator vorgeschlagen; gemeint war aber offensichtlich einKurzschluß-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.##
- 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. - 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
. Diese wurden zu08:00-16:00
jeden Tag
ausgewertet, was in den wenigsten Fällen gemeint ist. Zur Qualitätssicherung ist deshalb die Tagesangabe nicht mehr optional: wenn wirklichtäglich
gemeint ist, wird das durch
ausgedrückt.daily
In der OSM-Datenbank gibt es sehr häufig Angaben der Form
. Diese wurden zuMo-Fr
00:00-24:00
ausgewertet, was in den wenigsten Fällen gemeint ist. Zur Qualitätssicherung ist deshalb die Zeitangabe nicht mehr optional: wenn wirklich0:00-24:00
gemeint ist, soll das auch angegeben werden. - Die Regel ist zuständig für einen Tag, wenn dieser Tag in allen <day_list> enthalten ist.
Weekwrap
: es gibt keinenersten
Wochentag, sondern die Tage sind zyklisch geordnet:
ist ebenso zulässig wieFr-Mo
.Mo-Fr
Monthwrap
: wenn das zweite Datum vor dem ersten liegt, wird es in den nächsten Monat verschoben. Damit sind monatsübergreifende Tagesbereiche möglich.Yearwrap
: wenn das zweite Datum vor dem ersten liegt, wird es in das nächste Jahr verschoben. Damit sind jahresübergreifende Tagesbereiche möglich.Yearwrap
: wenn der zweite Monat vor dem ersten liegt, wird er in das nächste Jahr verschoben. Damit sind jahresübergreifende Tagesbereiche möglich.- Diese Schreibweise ist an die
crontab
angelehnt und erlaubt Ausdrücke wiein geraden Wochen
.
,PH
, undSH
: 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 BeispielBH
für die Schulferien in Nordrhein-Westfalen.SH(de.nrw)
Zu
habe ich die Regeln für Deutschland und Österreich hinterlegt, diese werden durch einePH
Angabe am jeweiligen Objekt aktiviert.addr:country
Bis auf weiteres
: bei der Schreibweise mit
beginnt die Gültigkeit am angegebenen Tag und gilt bis auf weiteres.+
- Implementiert die häufige Schreibweise
.May 1-10
- Hier können bei Bedarf bewegliche Feiertage anderer Kulturräume ergänzt werden.
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.Einzelzeitpunkt
: diese Schreibweise ist nur fürcollection_times
undservice_times
sinnvoll.Taktung
:
und10:00-16:00/90
stehen für10:00-16:00/1:30
von zehn bis vier alle 1½ Stunden
. Damit lassen sich insbesonders Abfahrtszeiten kompakt und übersichtlich ausdrücken. Bei Öffnungszeiten wird der Takt ignoriert.Open end
: es wird die Mindestöffnungszeit angegeben.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 ich06:00
bzw.18:00
ein.