Zh-hans:Key:opening_hours
| 说明 |
|---|
| 以标准格式描述某个设施何时开放或关闭。示例取值:Mo-Fr 08:00-17:00 |
| 组: properties |
| URL 模式 |
| https://openingh.openstreetmap.de/evaluation_tool/?EXP=$1 |
| 用于这些元素 |
| 已记载的值: 2 |
| 常用组合 |
| 另见 |
| 状态:已批准 |
| 此标签的工具 |

opening_hours=* 以标准格式描述某个设施何时开放或关闭。例如,opening_hours=Mo-Fr 08:00-17:00 表示周一至周五每天 8:00 至 17:00 开放。也可以记录复杂得多的情形。
Key:opening_hours/specification 是一份正式规范。Proposed features/Time domains 是一份历史文档,提供了更多背景信息。
如何标注
营业时间是一个属性,因此必须附着在已有对象上;例如 shop=*、amenity=*、tourism=*。几乎所有已知营业时间的对象都可以填写营业时间。语法相当复杂,但它能够表达甚至一些高度复杂的规则。
对大多数标注者而言,与其直接编辑标签取值,不如使用专门的工具,例如 JOSM 中的 OpeningHoursEditor 插件(可在偏好设置的插件菜单中添加)、Vespucci 的内置专用编辑器、Go Map!!、OsmAnd、Every Door、StreetComplete 的营业时间 quest,或 评估工具 以及 YoHours [1]网络工具。
这些工具可以用更友好的图形界面来构造将写入标签的营业时间文本。
请注意,某些工具如 Organic Maps[2]、CoMaps[3] 的界面对营业时间语法的理解非常有限,遇到较复杂的数据时会失败。
组合使用的标签
check_date:opening_hours=*— 最后一次核查营业时间的日期;opening_hours:url=*— 可获取该对象当前营业时间的 URL;source:opening_hours=*— 用于描述来源;opening_hours:signed=no- 现场没有标示营业时间的牌子。
示例说明
工作日开放
星期几缩写为 2 个字母,如下:
| Abbr. | 星期 |
|---|---|
| Mo | 星期一 |
| Tu | 星期二 |
| We | 星期三 |
| Th | 星期四 |
| Fr | 星期五 |
| Sa | 星期六 |
| Su | 星期日 |
多个开放时间段
opening_hours= Mo-Fr 08:00-12:00,13:00-17:30
|
| 与上面相同,但 12:00 至 13:00(中午 12 点至下午 1 点)关闭 |
用不含空格的逗号 (,) 分隔两个开放的时间区间。
多天相同时间段
opening_hours= Mo,We 08:00-12:00
|
| 周一和周三 08:00 至 12:00 开放 |
用不含空格的逗号 (,) 分隔各个日期。
多天且多个时间段
opening_hours= Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00
|
| 与上面相同,另外周六上午也开放 |
分别为每个日期范围填写营业时间,用分号加一个空格 (; ) 分隔。
注意下面的#午夜之后关门。
节假日休息
opening_hours= Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00; PH off
|
| 与上面相同,但明确标注在公共假日/银行假日休息 |
- 像使用星期几一样使用
PH。不用填写时间,而用off表示全天关闭。 - 用
SH表示学校假期。虽然很少见,但同一对象上也可以同时使用PH和SH;例如opening_hours=Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00; PH off; SH off
节假日不同时间
opening_hours= Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00; PH 09:00-12:00
|
| 在假日期间 09:00 至 12:00 开放 |
如前所述,PH 与星期几一样。由于它位于其余规则的右侧,因此会覆盖它们。关于哪些规则优先的更多信息,请参见这份更详尽的指南。
如果某个设施在学校假期的某些日期有不同的营业时间,可以用 SH 作为星期几的前缀:opening_hours=Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00; SH Mo-Sa 09:00-12:00(本例中的设施在学校假期期间周一至周六上午 9 点至中午 12 点开放,但在非学校假期期间营业时间不同。)
午夜之后关门
在某些情况下,场所会在午夜之后关门。例如周一 20:00 开门、午夜之后凌晨 2:00 关门,可以用以下方式标注——根据规范,这些都是有效的:
opening_hours= Mo 20:00-26:00
|
| 周一 20:00 开放,2:00 关闭 — 使用扩展小时语法 |
opening_hours= Mo 20:00-02:00
|
| 周一 20:00 开放,2:00 关闭 — 使用扩展小时语法 |
注意:这在某些校验器中可能会产生虚假的警告。
opening_hours= Mo 20:00-24:00, Tu 00:00-02:00
|
| 周一 20:00 开放。周二 2:00 关闭。—— 把周二的那一段单独标注 |
注意:
opening_hours= Mo 20:00-26:00; Tu 20:00-24:00
|
| 周一和周二 20:00 开放,午夜关闭。(!) |
因为后面的规则会使前面的规则被忽略,周二的规则会覆盖周二 0:00 至 2:00 开放的那一段。请务必使用逗号而不是分号来扩展规则!一般来说,使用逗号几乎总是更好的选择。
基于月份的例外
请记住,后面的规则会覆盖前面的规则。
要描述每个月某个星期几的第 n 次出现:
opening_hours= Mo 08:00-16:00; Mo[2] 08:00-12:00
|
| 每周一 8:00 至 16:00 开放,但每月第二个周一 8:00 至 12:00 开放。 |
要描述每个月某个星期几倒数第 n 次出现:
opening_hours= Mo 08:00-16:00; Mo[-2] 08:00-12:00
|
| 每周一 8:00 至 16:00 开放,但每月倒数第二个周一 8:00 至 12:00 开放。 |
要描述某个月份的所有日期:
opening_hours= Mo 08:00-16:00; Dec off
|
| 每周一 8:00 至 16:00 开放,但 12 月休息。 |
月份缩写为其名称的前三个字母:Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec。
要描述某个月份中的某一天:
opening_hours= Mo-Fr 08:00-16:00; Dec 12 off
|
| 周一至周五 8:00 至 16:00 开放,但 12 月 12 日休息。 |
月份可以与星期几组合。
opening_hours= Mo 08:00-16:00; Dec Mo 08:00-12:00
|
| 每周一 8:00 至 16:00 开放,但在 12 月每周一 8:00 至 12:00 开放 |
月份同样也可以互相组合或跨月表示,与星期几类似。
opening_hours= Mo 08:00-16:00; Jan-Mar Mo 08:00-12:00
|
| 每周一 8:00 至 16:00 开放,但在 1 月至 3 月每周一 8:00 至 12:00 开放 |
取值
对于 可通行的路径,请参见本文中的公路上营业时间的当前使用情况以及 access。
示例
24/7- 适用于:任何不停业(全天候营业)的设施(相关标签),一周 7 天、每天 24 小时
- 地图渲染:类似对象图标加一个 24
- (注意:关于 "24/7" 是否包含公共假日似乎存在一些[分歧](https://github.com/streetcomplete/StreetComplete/issues/5355#issuecomment-1804225354),因此更安全的做法是显式标注,例如
"Mo-Su,PH 00:00-24:00"或"Mo-Su 00:00-24:00; PH off")
Sa-Su 00:00-24:00- 适用于:仅周末开放但仍不停业,24 小时
Mo-Fr 08:30-20:00,或对于更复杂的营业时间:Mo 10:00-12:00,12:30-15:00; Tu-Fr 08:00-12:00,12:30-15:00; Sa 08:00-12:00Mo-Su 08:00-18:00; Apr 10-15 off; Jun 08:00-14:00; Aug off; Dec 25 off- 适用于:任何有营业时间的设施(相关标签)
- 地图渲染:什么都不显示,信息由软件获取
- Mo-Sa 10:00-20:00; Tu off 或 Mo-Sa 10:00-20:00; Tu 10:00-14:00
- 用于一段日期范围中的例外情况
- 适用于:任何有营业时间的设施(相关标签)
- 地图渲染:什么都不显示,信息由软件获取
- Tu-Fr 10:00-16:00, Mo 08:00-18:00 open "limited service", Tu-Fr 08:00-10:00 open "limited service", Tu-Fr 16:00-18:00 open "limited service"
Mo-Fr 08:00-18:00 open "limited service", Tu-Fr 10:00-16:00
Tu-Fr 10:00-16:00 _chipTab_ Mo-Fr 08:00-18:00 open "limited service"
Tu-Fr 10:00-16:00 open "all services" _chipTab_ Mo-Fr 08:00-18:00 open "limited service"- 周一至周五 8 点至 18 点开放,在核心时段之外提供有限服务(周一,以及周二至周五 10 点之前和 16 点之后)。这四个示例给出的营业时间相同。第一个示例使用逗号记法(",")向核心时段添加时间。第二个示例使用逗号记法覆盖部分时间段。另两个示例使用竖线("||")来添加核心时段之外的时间。
- sunrise-sunset
- 适用于:每天日出至日落之间开放
- 使用圆括号来加上时间偏移,例如某个公园在日出后 2 小时开放、日落前 2 小时关闭:(sunrise+02:00)-(sunset-02:00)
- dawn-dusk
- 从黎明开放到黄昏(给定日期的当地时间)
- dawn-sunrise, sunset-dusk
- 从黎明开放到日出、从日落开放到黄昏(给定日期的当地时间)
- Su 10:00+
- 周日 10:00 直至未知或未指明的关门时间。
- 适用于:任何有营业时间的设施(相关标签)
- 地图渲染:什么都不显示,信息由软件获取
- Apr-Oct: Fr-Su 10:00-18:00
- 周五至周日 10:00 至 18:00 开放,但仅在 4 月至 10 月之间。
- May Mo[-1] -2 days-Sep Mo[1]: Sa-Su 10:00-18:00
- 周末 10:00 至 18:00 开放,但仅从阵亡将士纪念日周末(5 月最后一个周一之前的那个周六)到劳动节(9 月的第一个周一)
- week 01-14 Mo-Su 10:00-17:00
- 第 1 周至第 14 周,周一至周日 10 至 17 点开放
- week 01-53/2 Fr 09:00-12:00; week 02-52/2 We 09:00-12:00
- 奇数周的周五以及偶数周的周三 09:00 至 12:00 开放
- 适用于:任何有营业时间的设施(相关标签)
- 地图渲染:什么都不显示,信息由软件获取
- 10:30-19:00; Jan 01-31/2,Feb 01-29/2,Mar 01-31/2,Apr 01-30/2,May 01-31/2,Jun 01-30/2,Jul 01-31/2,Aug 01-31/2,Sep 01-30/2,Oct 01-31/2,Nov 01-30/2,Dec 01-31/2 07:30-13:30; Su 10:00-13:00; Sa off
- 偶数日 10:30 至 19:00 开放,奇数日 7:30 至 13:30 开放,周日 10:00 至 13:00 开放,周六休息
- Mo-Sa 08:00-13:00,14:00-17:00 || "by appointment"
- 这里就派上了回退规则的用场。它适用于前面规则未处理到的任何时间。
- Su-Tu 11:00-01:00, We-Th 11:00-03:00, Fr 11:00-06:00, Sa 11:00-07:00
- 由于后面的规则会覆盖前面的规则这一设定,跨越午夜的时间必须使用额外的规则来表示,并且这些规则之间用逗号而不是分号分隔。
- Mo 11:00-14:00; Tu-Fr 11:00-14:00, 18:00-22:00; Sa 18:00-22:00
Mo-Fr 11:00-14:00, Tu-Sa 18:00-22:00- 午餐时段周一至周五开放,晚餐时段周二至周六开放。这两个示例给出的营业时间相同。第二个示例对重叠的日期使用逗号记法(",")。
- Mo-Th 18:00-01:00, Fr-Sa 18:00-03:00
Mo 18:00-24:00; Tu-Fr 00:00-01:00, 18:00-24:00; Sa 00:00-03:00, 18:00-24:00; Su 00:00-03:00- 周一至周六 18 点开放,凌晨 1 点关门,周五/周六除外(至凌晨 3 点)。这两个示例给出的营业时间相同。第一个示例对重叠的日期使用逗号记法(",")。
- Mo-Fr 08:00-12:00, We 14:00-18:00
Mo-Fr 08:00-12:00; We 08:00-12:00,14:00-18:00- 周一至周五上午以及周三下午开放。这两个示例给出的营业时间相同。第一个示例对重叠的日期使用逗号记法(",")。第二个示例使用分号,并覆盖了周三的 "Mo-Fr" 范围。
- Mo-Su,PH 15:00-03:00; easter -2 days off
- 每天(包括公共假日)都开放,但耶稣受难日休息。
- easter-7days - Nov 01: Tu-Sa 10:00-12:00,13:30-17:00; easter-7days - Nov 01: Su,PH 11:00-17:00
- 从棕枝主日至诸圣节开放,周日/公共假日的时间不同。此示例在 openingh 上校验失败(2026 年 8 月)。
- Dec 11-Dec 17: Su 10:00-17:00
- 在第三个将临期主日(不会早于 12 月 11 日,也不会晚于 12 月 17 日)上午 10:00 至下午 5:00 开放。
- Mo-Fr 09:00-12:30,13:30-17:00; PH -1 day 09:00-12:30; Sa-Su,PH off
- 周一至周五 9:00 至 12:30 以及 13:30 至 17:00 开放,但公共假日的前一个工作日除外;周末和公共假日休息。
- Tu-Sa 09:00-17:00; PH-2days Sa off; PH-1day Sa off; PH off
- 周二至周六开放。公共假日所在周末的周六休息(部分公共假日落在周一)。此示例在 openingh 上校验失败(2026 年 8 月)。
- Jan 20, Feb 20, Mar 20, Apr 20, May 20, Jun 20, Jul 20, Aug 20, Sep 20, Oct 20, Nov 20, Dec 20 09:00-10:00
- 每月 20 日 9 点至 10 点
- Mo-Fr 12:00-14:00 "winter"
- 冬季期间在工作日的午餐时段开放。如果冬季的时间范围已定义(月份、月-日、日期、周数等),则优先使用那种方式。
- Mo-Sa open, Mo-Fr 17:00+ closed, Sa 12:00+ closed; Su,PH off
- 周一至周六开放,17 点关门,周六除外(中午 12 点关门)。
- 2026 Dec 01-2026 Dec 23
- 今年 12 月 1 日至 23 日开放。
- closed; 2026 Oct 01-2026 Dec 31: Mo-Fr 09:00-17:00
- 目前周一至周五 9 点至 17 点开放,但在年末关闭。
- 更多示例请查看[评估工具](https://openingh.openstreetmap.de/evaluation_tool/)以及 opening_hours.js 的[文档](https://github.com/opening-hours/opening_hours.js#features)。
语法概要
这是一份覆盖大多数情况的概要。它的目的是让人能很快写出大多数营业时间标签,而不是解释完整语法。对于更复杂的情况,请参阅本节下方的文字、完整规范以及更多说明。
你可以用[评估工具](https://openingh.openstreetmap.de/evaluation_tool)检查自己的组合,或者使用更简单的 YoHours 应用(YoHours 不支持该语法的高级特性[1])。
- 图例
code要么就字面写成 code(在需要处包含一个字面空格分隔符;语法中其他位置的空格仅用于排版显示);- element 要替换为下面以 element: 开头的那一行所定义语法的 element;
- item... 表示 item 可以按需重复。
- [ sequence of items ] 表示 sequence of items 是可选的;
- | 表示必须从若干个(以该符号分隔的)项目序列中选择一个;
- 通用语法
opening_hours=rulesets [;rulesets ]...- 依次计算每个 ruleset,下一个 ruleset 可能会覆盖前面若干个 ruleset 中已匹配到的初始开/关状态。
- rulesets: rule [
||rule ]...- 依次计算每个 rule,直到它在指定的日期或时间上匹配为止,否则 ruleset 中的下一个 rule 只会作为回退被检查。
- rule: range [ status ] [ comment ]
- range: [ years ] dates [
times ] | times |24/7
- 指定可选年份的语法
- years: year_range [
,year_range ]... - year_range: year [
-year |+] [/n ]- 可以指定一个 n 年的可选周期,用于从第一个指定 year 开始的范围内的年份。
- year: 公历中的 4 位年份数字。
- 指定日期的语法(可含可选时间
- dates: monthly | weekly | daily | variably | holidays
- monthly: monthdays [
weekdays ] - weekly: [
weekweek_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 ]- 可以指定一个 n 周的可选周期,用于从第一个指定周数 ww 开始的范围内的周。
- weekdays: weekday_range [
,weekday_range ]... | Wd[n [,n ]...]- 星期几后面可以跟序号,从月初起正向计数,或从月末起负向计数:
- 例如
Mo-Fr 08:00-09:00,或Mo[1,3] 08:00-09:00; - 例如
Su[1]表示当月的第一个星期日,Su[-1]表示当月的最后一个星期日。
- weekday_range: Wd [
-Wd ] - ww: 01-53 范围内的 2 位周数(在 ISO 年中),例如
week 25 Mo 08:30-20:00 - dd: 01-31 范围内的 2 位月内日期数,例如
Dec 25 - Mth:
Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec- 3 个字母的英文月份缩写,例如
Dec 25
- 3 个字母的英文月份缩写,例如
- Wd:
Mo|Tu|We|Th|Fr|Sa|Su- 2 个字母的英文星期缩写,例如
Fr 08:30-20:00
- 2 个字母的英文星期缩写,例如
- yearly_fest:
easter- 目前唯一可指定的可变年度节日是复活节(假定使用基督教的公历)。
- variable_date: yearly_fest [ sign n
days],例如easter -2 days 08:00-17:00表示耶稣受难日的营业时间,或easter +49 days 08:00-17:00表示五旬节(圣灵降临节)的营业时间。 - holidays:
PH[ sign ndays] |SH- 公共假日(取决于位置,需要按国家/地区提供数据);学校假期(取决于位置,需要按学区提供数据)。
- 指定时间的语法
- times: time_range [
,time_range ]... - time_range: time [
-time |+]- 可用来代替 "late" 或 "until last customer",例如
12:00+。
- 可用来代替 "late" 或 "until last customer",例如
- time: fixed_time | variable_time
- fixed_time: HH
:mm - variable_time: event |
(event offset_time) - event:
dawn|sunrise|sunset|dusk- 请注意,日落与日出的时间需要地理位置信息来计算太阳的角高度,以及可观测地平线的角高度(后者也取决于海拔)。它们可以在建模大地水准面的海平面高度上近似取值,或者按当地时间粗略估计(视国家和时区而定)。
- offset_time: sign hh
:mm - hh: 00-48 范围内的相对 2 位小时数,例如
(sunrise+01:00)-12:00。 - HH: 00-23 范围内的绝对 2 位小时数(日内 24 小时制,不含 am/pm),例如
Fr 08:30-20:00。 - mm: 00-59 范围内的 2 位分钟数(每小时之内),例如
Fr 08:30-20:00。
- 用于微调日期和时间的其他通用语法元素
- sign:
+|- - n: 一个正整数。
- 可选修饰符的语法
- status:
unknown|open|closed|offunknown:初始的开或关状态,但后续那些会覆盖它的日期和时间除外(也可用于覆盖此前明确给出的开或关状态);open:在指定的日期和时间开放(若未给出时间则永久开放),但后续那些会覆盖它的日期和时间除外;closed或off:在指定的日期和时间关闭(若未给出时间则永久关闭),但后续那些会覆盖它的日期和时间除外;- 在标签值的第一个 ruleset 的每个 rule 中(包括回退规则),如果 status 没有随指定的 range 明确给出,则假定其含义为
open(除非存在针对它的 comment),并且所有其他未指定的日期和时间都保持为unknown。由此得到的日程随后会被每一个后续的 ruleset 依次修改。
- comment:
"text"- 一段简短注释(用
"包裹但其中不含"),用于说明适用的限制或条件,例如"children only"、"limited service"或"reservation by phone",reservation=*。 - 该注释用于在应用软件中显示,而不是被自动解析。注释中使用的语言并不由标签值本身规定,但可以通过键名中带有语言代码后缀的标签来指定(出于本地化目的)。
- 一段简短注释(用
语法
- wd 星期几,可用:Mo · Tu · We · Th · Fr · Sa · Su
Fr 08:30-20:00 - hh 小时,始终是以 24 小时制表示的两位数字(不含 am/pm),格式为 "hh:mm" ·
Fr 08:30-20:00 - mm 分钟,始终是两位数字,格式为 "hh:mm"
Fr 08:30-20:00 - mo 月份,可用:Jan · Feb · Mar · Apr · May · Jun · Jul · Aug · Sep · Oct · Nov · Dec · "mo md"
Dec 25 - md 月内日期,始终是两位数字,格式为 · "mo md"
Dec 25 - we 周数,始终是 01-53 范围内的两位数字,格式为 "week we"
week 25 Mo 08:30-20:00 - SH 学校假期。对于非母语英语使用者,请注意它同时也包括暑假,因此并不限于学年中的假期。
Mo-Fr 08:00-09:00,14:00-15:00; SH off[4] - PH 公共假日,可用于表示公共假日期间不同的营业时间
Mo-Fr 09:00-17:00; PH 10:00-12:00; PH Su off[4]
- 上面的例子表示正常营业时间为周一至周五上午 9 点至下午 5 点,但在公共假日为上午 10 点至中午 12 点,落在星期日的公共假日除外。
取值的通用语法为:hh:mm-hh:mm 08:30-20:00
取值的通用语法为:wd hh:mm-hh:mm Fr 08:30-20:00
取值的通用语法为:mo md: hh:mm-hh:mm Dec 25: 08:30-20:00
如 Key:opening_hours/specification 中所述,冒号是可选的。
取值的通用语法为:mo-mo: wd hh:mm-hh:mm Jun-Aug: Su 10:30-16:00 用于指定 6 月、7 月和 8 月中周日的开放时间。如 Key:opening_hours/specification 中所述,冒号是可选的。
取值的通用语法为:week we: wd hh:mm-hh:mm week 25: Mo 08:30-20:00
如 Key:opening_hours/specification 中所述,冒号是可选的。
规则
- 连续的小时[始终需要开-闭]用 "-" 分隔 ·
08:30-20:00 - 连续开放的星期几用 "-" 分隔 ·
Mo-Fr - 连续开放的月内日期用 "-" 分隔 ·
Dec 20-26或Dec 20-Jan 06 - 在一段连续的月内日期范围内以 "n" 为周期开放,该范围之后跟 "/n"
02-30/n - 连续开放的周用 "-" 分隔 ·
week 01-26 - 在一段连续的周范围内以 "n" 为周期开放,该范围之后跟 "/n"
week 02-52/n - 中断的日期用 "," 分隔 ·
Mo,We,Fr - 中断的时间用 "," 分隔 ·
08:30-14:00,16:30-20:00 - 不同日期上的不同时间可以用 ","(追加)或 ";"(覆盖)分隔
Mo-Sa 13:30-15:00,17:00-20:00, Tu-Sa 08:00-12:00; Th 11:00-16:00,17:00-19:00
- 读作:这些日期的这些营业时间,这些日期的这些营业时间;但是这些日期的这些营业时间。
- 某个星期几休息将标注为 "wd off"
Tu off - 一段星期几休息将标注为 "wd-wd off"
Tu-Th off - 某个月份休息将标注为 "mo off"
Aug off - 一段月份休息将标注为 "mo-mo off"
Aug-Sep off - 某个月份中的某一天休息将标注为 "mo md off"
Dec 25 off - 一段月内日期休息
- "mo md-md off"
Dec 24-26 off - "mo md - mo md off"
Dec 25-Jan 06 off
- "mo md-md off"
- 某段日期范围的例外,先写范围再写例外
Mo-Sa 10:00-20:00; Tu offMo-Sa 10:00-20:00; Tu 10:00-14:00Mo-Fr 08:00-12:30; We 14:00-17:00- 这意味着它们不是追加,例如 Mo-Fr 08:00-12:30; We 14:00-17:00 表示在周三这家店只在下午开放,而不是额外开放。
- 如果是在某段范围的第一天或最后一天,就不要使用例外规则,而使用通常的写法
Mo-Fr 10:00-20:00; Sa 10:00-14:00 - 一周中不连续或半连续的日期将标注为 wd[x]
Su[3] 09:00-12:00- 这用于表示当月第三个星期日 上午 9 点至中午 12 点。
- 使用 -1 表示当月的最后一天;例如 Aug Th[-1] 表示 8 月最后一个星期四。
- 可以使用分组,
Su[1,3,5] 和 Su[1-3]
- 如果某些天不停业,则为
00:00-24:00 - 如果一周 7 天、每天 24 小时,它有一个特定取值:24/7。
- 这样可以渲染出特定的图标。
- 用于标记日出时刻的特殊时间取值是:sunrise。
- 用于标记日落时刻的特殊时间取值是:sunset。
- 时间后面的 + 表示"起"或"开放至结束"
Sa 22:00+ 或 Sa 18:00-22:00+
更多细节请参见正式规范。
常见错误
| 错误 |
正确 |
说明 |
|---|---|---|
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"
|
添加 contact:phone=072-360-3200
|
10:00 - 13:30 / 17:00 - 20:30 |
10:00-13:30,17:00-20:30 |
|
April-September;
|
Apr-Sep:
|
|
Dining in: 6am to 11 pm;
|
06:00-23:00 open "Dining in" || 或 opening_hours=06:00-23:00opening_hours:drive_through=00:00-24:00
|
使用两个标签的优点是软件也能理解,例如可以提醒用户到达时只有得来速通道(drive-through)开放。 |
MWThF: 1200-1800; SaSu: 1200-1700 |
Mo,We,Th,Fr 12:00-18:00; Sa-Su 12:00-17:00 |
|
BAR:
|
Tu-Th 20:00-03:00 open "Club and 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
|
参见最后一个示例 |
Mo-Su,PH 08:00-20:00; 2025 May 15 - closed
|
closed; 2020 Jan 01 - 2025 May 15 Mo-Su,PH 08:00-20:00
|
开放式日期范围(例如店铺宣布在未来停业时)无法实现。相反,应反转条件,并使用过去的起始日期。 |
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 01:00-01:00 off
|
使用附加规则。不能写 "Sa,Su off",因为那会把时间 "Sa 00:00-01:00" 设为关闭。 公共假日的情形与此相同,但我们必须在次日 00:00-01:00 之间保持关闭。所以用从 01:00 开始的 24 小时来表示 "off"。 |
非公历
关于如何表示非公历(“Opening hours syntax for non Gregorian calendar”. 17 May 2019.)曾有一些讨论。
在公路上的使用
虽然基于时间的限制也用 access:conditional=* 标注,但标注者仍然更愿意/也会在 highway=* 上添加 opening_hours=*,因为在元素于某些指定时刻对所有交通方式都关闭的情况下,这种做法——通常使用正值而非负值——相比 access:conditional=* 有多个优点:
- 不必为所有已标注的交通方式重复关闭标签(
foot:conditional=*+bicycle:conditional=*+horse:conditional=*+ ...,之所以需要它们,是因为针对特定方式的foot=yes会覆盖通用的access:conditional=no @ ..。—— 标签) - 用正值表示常规营业时间更容易标注(例如
Mo-Fr 07:00-19:00; Sa-Su 10:00-17:00;而access:conditional=*中的负值在某些情况下可能给出意外结果——例如不同日期适用不同规则、且规则变更日当天的关闭时段跨越午夜时) - 更容易明确表明该路径确实全天、全时段开放(
opening_hours=24/7),用于这一点并非显而易见的情况,例如自然区域中的小径——其中许多在日落后或按季节关闭(在 OSM 中许多没有 access-conditional 标签的小径实际上在指定时间是关闭的) - 更容易用一个标签明确表明该元素确实对所有交通方式关闭(必须为每种交通方式分别评估
access:conditional标签) - 有更多工具可用于检查/校验语法结果([示例](https://openingh.openstreetmap.de/evaluation_tool/?setLng=en))
- 对可视化当前状态(开放/关闭)有更多支持;示例
公路上 opening_hours 的当前使用情况
要更精确地比较在 highway=* 上的使用情况还需要进一步分析,因为 access:conditional=* 不仅用于基于时间的限制,也用于其他类型的限制,例如长度、重量或天气状况。
不过,对这两个键[最常用](//taginfo.openstreetmap.org/keys/access%3Aconditional#values)的取值(日出/日落之间开放 / 日落-日出之间关闭)进行比较,可能颇具说明性:
- 目前(2026-02),在带
highway=*的路径上,这两个键的使用频率大致相当:
opening_hours=sunrise-sunset 使用了 5.5k 次([ohsome](https://dashboard.ohsome.org/en/#backend=ohsomeApi&groupBy=none&time=2016-02-19T11%3A00%3A00Z%2F2026-02-19T11%3A00%3A00Z%2FP1Y&filter=type%3Away+and+highway%3D*+and+opening_hours%3D+sunrise-sunset&measure=count&bboxes=-180%2C-90%2C+180%2C+90)),而 access:conditional=no @ (sunset-sunrise) 使用了 6.1k 次([ohsome](https://dashboard.ohsome.org/en/#backend=ohsomeApi&groupBy=none&time=2016-02-19T11%3A00%3A00Z%2F2026-02-19T11%3A00%3A00Z%2FP1Y&filter=type%3Away+and+highway%3D*+and+%22access%3Aconditional%22%3D%22no+%40+%28sunset-sunrise%29%22&measure=count&bboxes=-180%2C-90%2C+180%2C+90))
在 route=ferry 上的使用
- 目前(2026-02),在带
route=ferry的路径上,
opening_hours=*的使用频率约为access:conditional=*的 20 倍([1.200](https://dashboard.ohsome.org/en/#backend=ohsomeApi&groupBy=none&time=2016-02-19T11%3A00%3A00Z%2F2026-02-19T11%3A00%3A00Z%2FP1Y&filter=type%3Away+and+route%3Dferry+and+opening_hours%3D*+&measure=count&bboxes=-180%2C-90%2C+180%2C+90) 次 对 [63](https://dashboard.ohsome.org/en/#backend=ohsomeApi&groupBy=none&time=2016-02-19T11%3A00%3A00Z%2F2026-02-19T11%3A00%3A00Z%2FP1Y&filter=type%3Away+and+route%3Dferry+and+%22access%3Aconditional%22%3D*+&measure=count&bboxes=-180%2C-90%2C+180%2C+90) 次,ohsome)
路由器支持
- 截至 2024 年 3 月,Graphhopper 不支持路径上的 opening_hours,并且[也不打算添加](https://github.com/graphhopper/graphhopper/issues/2949#issuecomment-2003719682)。相反,它[支持 access:conditional](https://github.com/graphhopper/graphhopper/pull/2863)
- 截至 2026 年 5 月,Osmand 不支持路径上的 opening_hours。相反,它[支持 access:conditional](https://github.com/osmandapp/OsmAnd/issues/5480#issuecomment-513464606),并援引其在 2019 年更高的使用频率。
标准
营业时间语法已被引用纳入 [General Bikeshare Feed Specification](https://www.gbfs.org/documentation/reference/#hours-and-dates-of-operation)(GBFS)3.0 版,该标准是面向 amenity=bicycle_rental 运营方和交通主管部门的行业标准。
实现
JavaScript
由 User:Ypid 提供的 JavaScript 实现:
- [评估工具](https://openingh.openstreetmap.de/evaluation_tool)
- [源代码](https://github.com/opening-hours/opening_hours.js),以及[公共假日(PH)的定义](https://github.com/opening-hours/opening_hours.js/tree/main/src/holidays)
- [显示带有 opening_hours 的要素的地图](https://openingh.openstreetmap.de/?zoom=5&lat=50&lon=7)
- 用于以正则表达式搜索并加载 JOSM 中无法求值的取值的 [Python 脚本](https://github.com/opening-hours/opening_hours.js/blob/master/scripts/regex_search.py)(文档见 [README](https://github.com/opening-hours/opening_hours.js#small-scale))。
- 遵循最初由 Netzwolf 制定的正式规范。
- 基于 AMDmi3 所做的初始编码与设计。
其他实现:
- [Web to OSM Opening Hours](https://webmapping.cyou/WebToOSMOH) - 一个可以复制粘贴(几乎)任何网站内容并得到格式良好的 opening_hours 字符串的工具。欢迎在 [GitHub](https://github.com/OSM-de/WebToOSMOH) 上参与贡献!
Java
- [OpeningHoursParser](https://github.com/simonpoole/OpeningHoursParser) 解析器库
- [OpeningHoursEvaluator](https://github.com/goodudetheboy/OpeningHoursEvaluator) 基于上述库的 OH 求值器
- [OpeningHoursFragment](https://github.com/simonpoole/OpeningHoursFragment) Android OH 编辑器库。
- [opening-hours-evaluator](https://github.com/leonardehrenfried/opening-hours-evaluator) 用于检查在某个时刻 opening_hours 是否开放的库,使用 OpeningHoursParser 进行解析
Kotlin
- [osm-opening-hours](https://github.com/westnordost/osm-opening-hours) 解析器(多平台:JVM、JS、WASM、native)
PHP
- [SVN 中的 PHP 代码](https://svn.openstreetmap.org/applications/mobile/healthwhere/inc_openclosed.php),用于解析 opening_hours。
- [Services_Openstreetmap](https://github.com/pear/Services_Openstreetmap),一个用于操作 OpenStreetMap (OSM) API 的 PEAR PHP 包,支持解析多种营业时间语法——[示例见此](https://github.com/pear/Services_Openstreetmap/blob/master/tests/OpeningHoursTest.php)。
Python
- [KOpeningHours](https://invent.kde.org/libraries/kopeninghours) 解析器与校验器
- [pyopening_hours](https://github.com/opening-hours/pyopening_hours) 对 JavaScript 实现的封装(已不再维护,2024 年起已损坏——见 https://github.com/opening-hours/pyopening_hours/issues/3 )
- [humanized_opening_hours](https://github.com/rezemika/humanized_opening_hours) 转换为人类可读描述的转换器,支持多种语言[5](已不再维护)
- [opening-hours-py](https://pypi.org/project/opening-hours-py) 来自 [Rust crate](https://github.com/remi-dupre/opening-hours-rs/tree/master/opening-hours-syntax) 的解析器与求值器绑定
C++/Qt
- [KOpeningHours](https://invent.kde.org/libraries/kopeninghours) 解析、校验与求值(某一时刻的状态、在各区间上迭代)
Go
- [openhours](https://github.com/yauhen-l/openhours) 解析器与求值库
Rust
- [opening-hours-rs](https://github.com/remi-dupre/opening-hours-rs) 解析器与求值库(如果只需要解析器,请参阅 [opening-hours-syntax](https://crates.io/crates/opening-hours-syntax))
CartesApp
- [Cartes.app](https://cartes.app/?cat=cafe#16.37/47.899729/1.908412/20/50) 在用户选定的 POI 上使用这个键,按时间是否落在营业时段内、或该 POI 的 opening_hours 标签中是否完全没有指定时间,显示绿色、红色或白色圆点。
OsmAnd

- OsmAnd 在 POI 搜索界面上使用这个标签。现在的实现支持更多取值(例如月份和日期),并与条件限制支持一起加入。对于
highway=*或route=ferry,不支持在路由中使用标注了opening_hours=*的取值(但支持access:conditional=*)
Ulm、Neu-Ulm 及周边地区的营业时间

该网页应用位于 http://ulm-oeffnungszeiten.creal.de。当地区域的营业时间在地图上可视化显示。该应用的源代码以自由许可发布,可通过 [GitHub](https://github.com/cmichi/ulm-opening-hours) 获取。将该应用改用于其他城市非常容易,GitHub 页面上有相应说明。
更多地图与应用
网页应用:
- [openingh.openstreetmap.de](https://openingh.openstreetmap.de) / [openingh.ypid.de](https://openingh.ypid.de),带 opening_hours 标签图层的地图。
- [OsmAPP](https://osmapp.org) – 通用的查看/编辑工具,在每个要素上显示 `opening_hours`,并自 2024 年 9 月起为较简单的使用场景提供方便的编辑器([编辑器截图](https://github.com/zbycz/osmapp/pull/488))
移动应用:
- My Opening Hours,适用于 Android 设备
- Vespucci,功能完备的 Android 版 OSM 编辑器,包含专门的营业时间界面,可支持高度复杂的营业时间
- StreetComplete,对新手友好的 OSM 编辑器,除其他数据外还可以采集营业时间信息。
工具:
- [统计](https://openingh.openstreetmap.de/stats) 对数据质量及其随时间增长情况的可视化。
- [YoHours](https://projets.pavie.info/yohours),一个通过在日历上拖动时间区间来创建营业时间的网站。它不支持该语法的高级特性。[1]
- https://webmapping.cyou/WebToOSMOH 可借助自然语言处理将自由文本的营业时间转换/提取为 OSM 格式。
渲染
24/7(全天候)意味着需要特别对待,或许可以像这样在对象图标上加一个 "24":
。
其他特殊情况要明显得多。
显示营业时间的地图:
- [openingh.openstreetmap.de 地图](https://openingh.openstreetmap.de)([开放](https://openingh.openstreetmap.de/?filter=open)、[仅有语法错误的 opening_hours](https://openingh.openstreetmap.de/?filter=error))
已弃用的旧标签
以下这些(未文档化的)键已弃用,应改用 opening_hours=*。应按上文所述来解释它们的取值,以设定新键的取值:
相关标签
opening_hours:signed=no - 当营业时间没有张贴在外部可见的牌子上时
以下这些键出于不同用途使用相同的语法:
collection_times=*– 邮筒或回收箱的收取时间service_times=*– 某要素上不同于营业时间的特殊服务的时间,例如宗教礼拜breakfast=*– 是否供应早餐以及供应时间lunch=*– 是否供应午餐以及供应时间lunch:buffet=*– 供应自助午餐的时间lunch:menu=*– 供应套餐午餐的时间
dinner=*– 是否供应晚餐以及供应时间happy_hours=*– 某场所提供酒精饮料折扣的时间smoking_hours=*– 仅在规定的时间范围内允许吸烟
Conditional restrictions 也复用营业时间语法来指定基于日期和时间的条件。
有些人用 appointment=* 标注那些(只能)预约前往的场所,而不是使用 opening_hours=*。
如果某处已永久关闭,且该对象已完全消失、重新标注也没有风险,则应删除该对象。如果仍有遗迹存在,可以使用带有lifecycle prefix的标签,例如 disused:*=* 或 abandoned:*=*
参见
- JOSM/Plugins/OpeningHoursEditor – opening_hours 标签的图形编辑器
- 相关的 Sophox 查询:
外部链接
在线工具:
- [Openingh.openstreetmap.de](https://openingh.openstreetmap.de/evaluation_tool/?setLng=en) – 用于检查和求值 opening_hours 标签的工具
- [YoHours](https://projets.pavie.info/yohours) – 该标签语法的在线编辑器。它不支持该语法的高级特性。[1]
- [WebToOSMOH](https://osm-de.github.io/WebToOSMOH) – 将自由格式文本转换为 opening_hours 语法的在线转换器
- OSM Open – 查找在某一特定时刻开放的 POI
- [OSM Opening Hours Validation](https://opening-hours.pages.dev/):一份关于 OpenStreetMap 数据中无效营业时间的报告,按国家划分。
解析器库:
- goodudetheboy/OpeningHoursEvaluator GitHub – Java
- opening-hours/opening_hours.js GitHub – JavaScript/Node.js([接受假日信息](https://github.com/opening-hours/opening_hours.js#holiday-data))
- opening-hours/pyopening_hours GitHub – Python([不再维护](https://github.com/opening-hours/pyopening_hours/issues/4#issuecomment-1644376827))
- remi-dupre/opening-hours-rs GitHub – Rust
- rezemika/humanized_opening_hours GitHub – Python(不再维护)
- ubahnverleih/simple-opening-hours GitHub – JavaScript
- ujamii/osm-opening-hours GitHub – PHP
- westnordost/osm-opening-hours GitHub – Kotlin Multiplatform
校验器库:
- rezemika/oh_sanitizer GitHub – Python
转换器库:
- anct-cartographie-nationale/timetable-to-osm-opening-hours GitHub – TypeScript
编辑器库:
- bryceco/OpeningHours GitHub – SwiftUI
- marvinschopf/react-hours GitHub – React
- simialbi/jquery-yohours GitHub – jQuery
- simonpoole/OpeningHoursFragment GitHub – Android
参考资料
- ↑ 1.0 1.1 1.2 1.3 YoHours 不支持该语法的高级特性。 https://framagit.org/PanierAvide/YoHours
- ↑ https://github.com/organicmaps/organicmaps/issues/1575 关于 PH
- ↑ https://codeberg.org/comaps/comaps/issues/4996
- ↑ 4.0 4.1 可以为 opening_hours.js 添加默认假日。另有一套默认值的替代系统,目前尚未被 opening_hours.js 计算:Default 是关于默认值系统的提案。该提案可以设置诸如区域(国家、州等)的 maxspeed 之类的默认值,也可以设置假期时段。一个国家、一个 zone 区域可以订阅包含此类假期定义的 default。
- ↑ https://github.com/rezemika/humanized_opening_hours?tab=readme-ov-file#have-nice-schedules
Warning: Default sort key "Opening_hours" overrides earlier default sort key "Key:opening hours".
