Key:opening_hours

From OpenStreetMap Wiki
Jump to navigation Jump to search
Public-images-osm logo.svg opening_hours
Neon Internet Cafe open 24 hours.jpg
Description
Describes when something is open or closed in a standard format. Edit this description in the wiki page. Edit this description in the data item.
Group: properties
URL pattern
https://openingh.openstreetmap.de/evaluation_tool/?EXP=$1
Used on these elements
may be used on nodesmay be used on waysmay be used on areas (and multipolygon relations)may be used on relations
Documented values: 1
Useful combination
See also
Status: de facto
Many editors offer a special interface allowing easier editing of these data; here, StreetComplete quest is pictured with editing opening hours data in progress.

opening_hours=* describes when a feature is open or closed in a standard format. For example, opening_hours=Mo-Fr 08:00-17:00 specifies being open from every day Monday to Friday, from 8:00 to 17:00. Far more complex cases can be also recorded.

Key:opening_hours/specification is a formal specification. Proposed features/Time domains is an historic document with some more background.

How to map

Opening hours are an attribute, so must go with an existing object; e.g., shop=*, amenity=*, tourism=*. It is possible to enter opening hours for almost everything that has known hours of operation. The syntax is quite complex, but it allows even some highly complicated rules.

For most mappers, rather than attempting to edit tag values directly, it is better to make use of special tools like the OpeningHoursEditor plugin in JOSM (can be added in plugin menu in preferences), built-in special editor in Vespucci, Go Map!!, OsmAnd, StreetComplete opening hours quest, or evaluation tool and YoHours web tools.

Tags used in combination

Explanation by example

Open on weekdays

Image demonstrating to use a hyphen to separate the first and last weekday in the range, a space between the day range and the time interval, and noting that a leading zero is mandatory.

Weekdays are abbreviated to 2 letters as follows:

Abbr. Day of week
Mo Monday
Tu Tuesday
We Wednesday
Th Thursday
Fr Friday
Sa Saturday
Su Sunday

Multiple opening intervals

opening_hours= Mo-Fr 08:00-12:00,13:00-17:30

Same as above, but closed from 12:00 to 13:00 (noon to 1 PM)

Add the two time intervals in which they are open, separated by a comma without spaces (,).

Multiple days same time periods

opening_hours= Mo,We 08:00-12:00

Open on Monday and Wednesday from 08:00 to 12:00

Add days separated by a comma without spaces (,).

Multiple days and multiple time periods

opening_hours= Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00

Same as above, also open on Saturday mornings

Add the opening hours for each day range, separated by a semicolon with following space (; ).

Closed on holidays

opening_hours= Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00; PH off

Same as above, but explicitly tagged as closed on public holidays
  • Use PH as if it were a weekday. Instead of hours, use off to say they're closed all day.
  • Use SH for school holidays. Although this is rare, you can also use both PH and SH on the same object; e.g. opening_hours=Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00; PH off; SH off

Different hours on holidays

opening_hours= Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00; PH 09:00-12:00

On holidays, they are open from 09:00 to 12:00

As said before, PH is just like a weekday. Because it is to the right of the rest of the rules, it overwrites them. For more information on which rules take precedence, see this more elaborate guide.

If a feature has different opening hours on some days during the school holidays, SH can be used as a prefix to the weekdays: opening_hours=Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00; SH Mo-Sa 09:00-12:00 (The feature in this example is open Monday to Saturday 9am to 12pm during the school holidays, but has different opening hours out of the school holidays.)

Closing after midnight

In some cases places are closing after midnight. For example place opening on Monday at 20:00 and closing after midnight, at 2:00 can be marked in following ways - which are all valid, according to specification:

opening_hours= Mo 20:00-26:00

Open on Monday at 20:00, closed 2:00 — using extended hour syntax
opening_hours= Mo 20:00-02:00

Open on Monday at 20:00, closed 2:00 — using extended hour syntax

Note: This might yield a spurious warning in some validators.

opening_hours= Mo 20:00-24:00, Tu 00:00-02:00

Open on Monday at 20:00. Closed on Tuesday at 2:00. - with tagging Tuesday chunk separately

Caution:

opening_hours= Mo 20:00-26:00; Tu 20:00-24:00

Open on Monday and Tuesday at 20:00 and closed at midnight. (!)

Because following rules cause previous ones to be ignored, Tuesday rule overwrites the Tuesday open from 0:00 to 2:00 o'clock chunk. Make sure to use a comma instead of a semicolon to extend the rule!

Exception based on month

Recall that following rules will overwrite previous ones.

To describe in every month, the nth occurrence of a weekday:

opening_hours= Mo 08:00-16:00; Mo[2] 08:00-12:00

Open on Mondays from 8:00 to 16:00, but on the second Monday of each month, open from 8:00 to 12:00.

To describe, in every month, the nth to last occurrence of a weekday:

opening_hours= Mo 08:00-16:00; Mo[-2] 08:00-12:00

Open on Mondays from 8:00 to 16:00, but on the second to last Monday of each month, open from 8:00 to 12:00.

To describe every day of a month:

opening_hours= Mo 08:00-16:00; Dec off

Open on Mondays from 8:00 to 16:00, but closed in December.

Months are abbreviated to the first three letters of their name: Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec.

To describe a day of a month:

opening_hours= Mo-Fr 08:00-16:00; Dec 12 off

Open on Mondays to Fridays from 8:00 to 16:00, but closed on December 12th.

Months can be combined with weekdays.

opening_hours= Mo 08:00-16:00; Dec Mo 08:00-12:00

Open on Mondays from 8:00 to 16:00, but in December is open on Mondays from 8:00 to 12:00

Months can also be combined, or spanned, similarly to weekdays.

opening_hours= Mo 08:00-16:00; Jan-Mar Mo 08:00-12:00

Open on Mondays from 8:00 to 16:00, but in January to March is open on Mondays from 8:00 to 12:00

Values

For way traversable ways, see Key:access.

Examples

  • 24/7
    Applied to: any non-stop facilities (related tags), 24 hours a day, 7 days a week
    Render on map: something like object icon with a 24
    (note: there seems to be some disagreement whether "24/7" includes public holidays or not, so it is safer to mark it explicitly e.g. "Mo-Su,PH 00:00-24:00" or "Mo-Su 00:00-24:00; PH off" instead)
  • Sa-Su 00:00-24:00
    Applied to: opens only the weekend but non-stop, 24 hour
  • Mo-Fr 08:30-20:00 or for more complex opening hours:
    Mo 10:00-12:00,12:30-15:00; Tu-Fr 08:00-12:00,12:30-15:00; Sa 08:00-12:00
    Mo-Su 08:00-18:00; Apr 10-15 off; Jun 08:00-14:00; Aug off; Dec 25 off
    Applied to: any facilities with opening hours (related tags)
    Render on map: nothing, information recovered by software
  • Mo-Sa 10:00-20:00; Tu off or Mo-Sa 10:00-20:00; Tu 10:00-14:00
    For exceptions in a range of days
    Applied to: any facilities with opening hours (related tags)
    Render on map: nothing, information recovered by software
  • sunrise-sunset
    Applied to: opens every day between sunrise and sunset.
    Use round brackets to add a time offset, for example a park that opens 2 hours after sunrise and closes 2 hours before sunset (sunrise+02:00)-(sunset-02:00)
  • Su 10:00+
    Sunday from 10:00 to an unknown or unspecified closing time.
    Applied to: any facilities with opening hours (related tags)
    Render on map: nothing, information recovered by software
  • Apr-Oct: Fr-Su 10:00-18:00
    Open from 10:00 to 18:00 from Friday to Sunday, but only between April and October.
  • week 1-53/2 Fr 09:00-12:00; week 2-52/2 We 09:00-12:00
    Open from 09:00 to 12:00 on Fridays of odd weeks and on the Wednesdays of even weeks
    Applied to: any facilities with opening hours (related tags)
    Render on map: nothing, information recovered by software
  • Mo-Sa 08:00-13:00,14:00-17:00 || "by appointment"
    Here does the fallback rule come in handy. It applies for any time which was not handled by previous rules.
  • Su-Tu 11:00-01:00, We-Th 11:00-03:00, Fr 11:00-06:00, Sa 11:00-07:00
    Because of the definition that following rules will overwrite previous ones, times which span over midnight have to use additional rules which are separated by a comma instead of a semicolon.
  • Mo-Su,PH 15:00-03:00; easter -2 days off
    Every day, even on public holiday open, but closed on Good Friday.
  • Dec 11-Dec 17: Su 10:00-17:00
    Open on the 3rd Advent (which cannot take place before the 11th or after the 17th December) from 10:00 a.m. to 5:00 p.m.
  • For more examples check out the evaluation tool and the documentation of opening_hours.js.

Summary syntax

This is a summary covering most cases. Its goal is to allow writing most opening hours tags in a short time, not to explain the full syntax. For more complicated cases, please refer to the text below this section, to the full specification and to more explanations.

You can check your compositions with the evaluation tool, or the simpler YoHours application.

Legend
code is either written literally as such (including a literal space separator   where needed; elsewhere spaces in the syntax are only for its presentation);
element is to be replaced by the element whose syntax is defined in a line starting by element: below;
item... means that item can be repeated as needed.
[ sequence of items ] means that the sequence of items is optional;
| indicates that one of the sequences of items (separated by this symbol) must be chosen;
General syntax
opening_hours= rulesets [ ; rulesets ]...
Each ruleset is evaluated in order, the next ruleset possibly overriding the initial open or closed state that may have been matched in the previous rulesets.
rulesets: rule [ || rule ]...
Each rule is evaluated in order until it matches for the indicated dates or times, otherwise the next rule in the ruleset will be checked only as a fallback.
rule: range [ status ] [ comment ]
range: [ years ] dates [   times ] | times | 24/7
Syntax for specifying optional years
years: year_range [ , year_range ]...
year_range: year [ - year | + ] [ / n ]
An optional period of n years may be specified for years to include within the specified range starting at the first specified year.
year: A 4-digit year number in the Gregorian calendar.
Syntax for specifying dates (with optional times)
dates: monthly | weekly | daily | variably | holidays
monthly: monthdays [   weekdays ]
weekly: [ week   week_range [ , week_range ]...   ] weekday_range [ , weekday_range ]...
daily: months [   monthdays [ , monthdays ]... ]
variably: variable_date [ - variable_date ]
months: Mth [ -Mth ]
monthdays: dd [ -dd ]
week_range: ww [ - ww | + ] [ / n ]
An optional period of n weeks may be specified for weeks to include within the specified range starting at the first specified week number ww.
weekdays: weekday_range [ , weekday_range ]... | Wd[ n [ , n ]... ]
Week days may be followed by rank numbers, counted positively from the start of the month, or negatively from the end of month:
e.g. Mo-Fr 08:00-09:00, or Mo[1,3] 08:00-09:00;
e.g. Su[1] means the first Sunday of the month, and Su[-1] means the last Sunday of the month.
weekday_range: Wd [ - Wd ]
ww: A 2-digit week number (in ISO year) in range 01-53, e.g. week 25 Mo 08:30-20:00
dd: A 2-digit monthday number in range 01-31, e.g. Dec 25
Mth: Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
A 3-letter abbreviated English month name, e.g. Dec 25
Wd: Mo | Tu | We | Th | Fr | Sa | Su
A 2-letter abbreviated English weekday name, e.g. Fr 08:30-20:00
yearly_fest: easter
For now, the only variable yearly fest day specified is Easter (assuming the Christian Gregorian calendar).
variable_date: yearly_fest [ sign n days ], e.g. easter -2 days 08:00-17:00 for opening hours on Good Friday, or easter +49 days 08:00-17:00 for opening hours on Whitsun/Pentecost.
holidays: PH | SH
Public holiday (location dependent, requires data per country/region); scholar holiday (location dependent, requires data per scholar academy).
Syntax for specifying times
times: time_range [ , time_range ]...
time_range: time [ - time | + ]
This may be used in place of "late" or "until last customer", e.g. 12:00+.
time: fixed_time | variable_time
fixed_time: HH : mm
variable_time: event | ( event offset_time )
event: dawn | sunrise | sunset | dusk
Note that sunset and sunrise times requires geolocation to compute the position angular elevation of the sun, and the the angular elevation of the observable horizon (which is also dependent of the altitude). They may be approximated at sea level on the modelling geoid, or just estimated roughly in local time (per country and time zone).
offset_time: sign hh : mm
hh: A relative 2-digit hours number in range 00-48, e.g. (sunrise+01:00)-12:00.
HH: An absolute 2-digit hours number (in day, in 24 hour format, no am/pm) in range 00-23, e.g. Fr 08:30-20:00.
mm: A 2-digit minutes number (in hour) in range 00-59, e.g. Fr 08:30-20:00.
Other generic syntactic elements used for tuning dates and times
sign: + | -
n: A positive integer.
Syntax for optional modifiers
status: unknown | open | closed | off
unknown: initial open or closed state, except at overriding dates and times that follow (may also be used to override a previous explicit open or closed status);
open: open at the indicated dates and times (or permanently if no time is given), except at overriding dates and times that follow;
closed or off: closed at the indicated dates and times (or permanently if no time is given), except at overriding dates and times that follow;
In each rule of the first ruleset of the tag value (including fallbacks), if the status is not explicitly specified with the specified range, it is assumed to be meant as open, leaving all other unspecified dates and times as unknown; the resulting schedule is then successively modified by each following ruleset.
comment: "text"
A short comment (wrapped in " but not containing any " within) showing applicable restrictions or specifications, e.g. "children only", "limited service", or "reservation by phone", reservation=*.
This comment is intended to be displayed in applications and not to be interpreted automatically. The language used in this comment is not specified by the tag value itself, but this could be specified (for localisation purpose) by tags whose key contains a language code suffix.

Syntax

  • wd weekday, available: Mo · Tu · We · Th · Fr · Sa · Su (e.g., > Fr 08:30-20:00)
  • hh hour, always two digits number in 24 hour basis (no am/pm), in the format "hh:mm" · (e.g., > Fr 08:30-20:00)
  • mm minute, always two digits number in the format "hh:mm" (e.g., > Fr 08:30-20:00)
  • mo month, available: Jan · Feb · Mar · Apr · May · Jun · Jul · Aug · Sep · Oct · Nov · Dec · "mo md" (e.g., > Dec 25)
  • md monthday, always two digits number in the format · "mo md" (e.g., > Dec 25)
  • we week number, always a two digit number in range 01-53, in the format "week we" (e.g., > week 25 Mo 08:30-20:00)
  • SH School holiday, can be used to indicate different opening hours during school holidays (e.g., Mo-Fr 08:00-09:00,14:00-15:00; SH off)[1]
  • PH Public holiday, can be used to indicate different opening hours during public holidays (e.g., Mo-Fr 09:00-17:00; PH 10:00-12:00; PH Su off)[1]
The above example means normal hours are Monday to Friday 9 am to 5 pm, except on public holidays it is 10 am to 12 pm, except public holidays that fall on a Sunday.

The general syntax for the value is: hh:mm-hh:mm (e.g., > 08:30-20:00).

The general syntax for the value is: wd hh:mm-hh:mm (e.g., > Fr 08:30-20:00).

The general syntax for the value is: mo md: hh:mm-hh:mm (e.g., > Dec 25: 08:30-20:00). Note that the colon is optional as mentioned under Key:opening_hours/specification.

The general syntax for the value is: mo-mo: wd hh:mm-hh:mm (e.g., Jun-Aug: Su 10:30-16:00 to specify the opening times on Sundays in June, July and August). Note that the colon is optional as mentioned under Key:opening_hours/specification.

The general syntax for the value is: week we: wd hh:mm-hh:mm (e.g., > week 25: Mo 08:30-20:00). Note that the colon is optional as mentioned under Key:opening_hours/specification.

Rules

  • Consecutive hours [always needs open-close] separated by "-" · (e.g., > 08:30-20:00)
  • Consecutive weekdays open separated by "-" · (e.g., > Mo-Fr)
  • Consecutive monthdays open separated by "-" · (e.g., > Dec 20-26) or (e.g., > Dec 20-Jan 06)
  • Open with periodicity "n" within a range of consecutive monthdays, the range is followed by "/n" (e.g., > 02-30/n)
  • Consecutive weeks open separated by "-" · (e.g., > week 01-26)
  • Open with periodicity "n" within a range of consecutive weeks, the range is followed by "/n" ( e.g.> week 02-52/n )
  • A break on days separated by "," · (e.g., > Mo,We,Fr)
  • A break on hours separated by "," · (e.g., > 08:30-14:00,16:30-20:00)
  • Different hours on different days are separated by ";" (e.g., > Mo 10:00-12:00,12:30-15:00; Tu-Fr 08:00-12:00,12:30-15:00; Sa 08:00-12:00)
reads as: this opening hours for this days ; this opening hours for this days
  • A weekday off will be tagged as "wd off" (e.g., > Tu off)
  • A range of weekdays off will be tagged as "wd-wd off" (e.g., > Tu-Th off)
  • A month off will be tagged as "mo off" (e.g., > Aug off )
  • A range of months off will be tagged as "mo-mo off" (e.g., > Aug-Sep off)
  • A monthday off will be tagged as "mo md off" (e.g., > Dec 25 off)
  • A range of monthdays off will be tagged as "mo md-md off" (e.g., > Dec 24-26 off) or "mo md - mo md off" (e.g., > Dec 25-Jan 06 off )
  • Exceptions to a range of days, first the range then the exception (e.g., > Mo-Sa 10:00-20:00; Tu off) or (e.g., > Mo-Sa 10:00-20:00; Tu 10:00-14:00) or (e.g., > Mo-Fr 08:00-12:30; We 14:00-17:00)
    • This means these are not additions, for example Mo-Fr 08:00-12:30; We 14:00-17:00 means that on Wednesdays, the shop is only opened in the afternoons and not additionally.
  • If it is in the first or last day of a range then don't use the exception rule, use the usual (e.g., > Mo-Fr 10:00-20:00; Sa 10:00-14:00)
  • Non-consecutive or semi-consecutive days of the week will be tagged as wd[x] (e.g., Su[3] 09:00-12:00)
    • This is used to indicate the 3rd Sunday of the month from 9 am to 12 pm.
    • Use -1 to indicate the last day of the month; e.g., Aug Th[-1] means last Thursday in August.
    • Can use grouping, (e.g., Su[1,3,5] and Su[1-3])
  • If hours are non stop some days then (e.g., > 00:00-24:00)
  • If it is 24 hours 7 days a week it has a specific value: 24/7.
    • This way it can render a specific icon.
  • A special time value to mark the time the sun rises is: sunrise.
  • A special time value to mark the time the sun sets is: sunset.
  • A + after a time means "from" or "open end" (e.g., Sa 22:00+ or Sa 18:00-22:00+)

See the formal specification for more details.

Common mistakes

Incorrect stop hand Correct check mark Notes notice "i"
7/8-23 Mo-Su 08:00-23:00
0600-1800 06:00-18:00
07;00-2;00pm 07:00-14:00
08.00-16.00, public room till 03.00 a.m 08:00-16:00 open, 16:00-03:00 open "public room"
09:00-21:00 TEL/072(360)3200 09:00-21:00 "call us" Add contact:phone=072-360-3200
10:00 - 13:30 / 17:00 - 20:30 10:00-13:30,17:00-20:30
April-September;
Mo-Fr 09:00-13:00,
14:00-18:00, Sa 10:00-13:00
Apr-Sep:
Mo-Fr 09:00-13:00,14:00-18:00;
Apr-Sep: Sa 10:00-13:00
Dining in: 6am to 11pm;
Drive-through: 24/7
06:00-23:00 open "Dining in" ||
00:00-24:00 open "Drive-through"
MWThF: 1200-1800; SaSu: 1200-1700 Mo,We,Th,Fr 12:00-18:00; Sa-Su 12:00-17:00
BAR:
Su-Mo 18:00-02:00;
Tu-Th 18:00-03:00;
Fr-Sa 18:00-04:00;
CLUB:
Tu-Th 20:00-03:00;
Fr-Sa 20:00-04:00
Tu-Th 20:00-03:00 open "Club and bar";
Fr-Sa 20:00-04:00 open "Club and bar" ||
Su-Mo 18:00-02:00 open "bar" ||
Tu-Th 18:00-03:00 open "bar" ||
Fr-Sa 18:00-04:00 open "bar"
Su-Th 11:00-03:00; Fr-Sa 11:00-05:00 Su-Th 11:00-03:00, Fr-Sa 11:00-05:00 See last example
Mo-We 17:00-01:00; Th,Fr 15:00-01:00; PH,Sa,Su off Mo-We 17:00-01:00, Th,Fr 15:00-01:00; PH off Use additional rules. You cannot say "Sa,Su off" because that would set the time "Sa 00:00-01:00" to closed.

Non-Gregorian calendars

There has been some discussion about how to map non-Gregorian calendars (“Opening hours syntax for non Gregorian calendar”. 17 May 2019. ).

Implementation

JavaScript

JavaScript implementation by User:Ypid:

Other implementations:

  • Web to OSM Opening Hours - A tool for copy&pasting (almost) any website content and getting a decently formatted opening_hours-string. Contributions welcome on GitHub!

Java

Kotlin

PHP

Python

C++/Qt

  • KOpeningHours Parsing, validation and evaluation (status at a certain time, iteration over intervals)

Rust

OsmAnd

OsmAnd 2.0 showing whether the POI is known to be open or closed based on tagging of opening_hours. For example, the my daBBA restaurant was closed when the screenshot was taken; however, Sugran Swayapakghar was open.

OsmAnd uses this tag on the POI search screen. The implementation now includes more values (such as months and dates), added together with conditional restriction support.

Opening hours for Ulm, Neu-Ulm, and surroundings

Ulm, Neu-Ulm and surrounding areas.

The web application is available on http://ulm-oeffnungszeiten.creal.de. Opening hours for the local area are visualized on a map. The source code of this application is freely licensed and available via GitHub. Adapting the application to a different city is very easy and described on the GitHub page.

More maps and applications

Web applications:

Mobile apps:

  • My Opening Hours for Android devices
  • Vespucci, full featured OSM editor for Android that includes special opening hours interface that includes support for highly complicated opening hours
  • StreetComplete, newbie friendly OSM editor that allows to collect, among other data, opening hours information.

Tools:

Rendering

24/7 (around the clock) shouts out for special treatment, perhaps something like adding "24" to the object icon: Pharmacy dispencing 24.png.

Any other special cases are much less obvious.

Maps showing opening hours:

Former tags, now deprecated

The following (undocumented) keys have been deprecated and should be replaced by this opening_hours=*. Their value should be interpreted to set the value of the new key, as described above:

If you know places with this tag, verify if it could be tagged with another tag.
Automated edits are strongly discouraged unless you really know what you are doing!
If you know places with this tag, verify if it could be tagged with another tag.
Automated edits are strongly discouraged unless you really know what you are doing!
If you know places with this tag, verify if it could be tagged with another tag.
Automated edits are strongly discouraged unless you really know what you are doing!
If you know places with this tag, verify if it could be tagged with another tag.
Automated edits are strongly discouraged unless you really know what you are doing!

Related tags

opening_hours:signed=no - When the opening hours are not posted on a sign visible externally

The following keys use the same syntax for different purposes:

  • collection_times=* - The collection times of a post box or recycling container
  • service_times=* - The times of a special service at a feature which is different than the opening hours, e.g, a religious service
  • breakfast=* - If and when breakfast is served
  • lunch=* - If and when lunch is served
  • dinner=* - If and when dinner is served
  • happy_hours=* - Time when a place offers discounts on alcoholic drinks
  • smoking_hours=*

Conditional restrictions also re-use the opening hours syntax to specify date- and time-based conditions.

If a location is closed permanently, then delete such object if it fully gone without risk of being remapped. If there are remains present you can use a tag with a lifecycle prefix such as disused:*=* or abandoned:*=*

See also

External links

Online tools:

Parser libraries:

Validator libraries:

Converter libraries:

Editor libraries:

References

  1. 1.0 1.1 The default holidays can be added to opening_hours.js. There is an alternative system for default values which is currently not evaluated by opening_hours.js: Default is a proposal for a default values system. This proposal can set default values such as maxspeed for areas (countries, states, etc.), but also holidays periods. A country, a zone area can subscribe to a default containing such holidays definitions.