opening_hoursタグの書き方について


opening_hoursというタグがあります。

お店の開店時間や、施設の利用可能時間の他、AEDなどの設備が利用できる時間を示すために使われます。

入力した結果は、[OpenLinkMap](http://www.openlinkmap.org/?zoom=6&lat=50.47703&lon=10.98091&layers=B0FTTT)や[osm24.eu](http://osm24.eu/index.php#!18/35.46498/139.61894/)などで確認することができます。

![スクリーンショット 2015-01-22 22.55.18.png](https://qiita-image-store.s3.amazonaws.com/0/9928/e40a88f6-d2dd-4845-8c32-2de41dc67e99.png "スクリーンショット 2015-01-22 22.55.18.png")


このタグは非常に有効性が高く、POIを登録するときには是非使って欲しいものなのですが、記法がイマイチ日本人の感覚に合わず、あまり入力されていないという現状があります。
ここでは、その利用方法について、いくつかの解説を試みます。

## 基本的な使い方
最も入力しやすい方法として、JOSMの `OpeningHoursEditor` というプラグインがあります。
これは起動すると、opening_hoursタグを塗りつぶし形式で入力することができます。ほとんどの場合、このプラグインで生成した記述でなんとかなります。
JOSMのメニュー画面から`データ -> 開店時間を編集` で起動することができます。

![スクリーンショット 2015-01-22 22.57.42.png](https://qiita-image-store.s3.amazonaws.com/0/9928/aa153b2d-0f17-b0d9-5408-c802d05623b3.png "スクリーンショット 2015-01-22 22.57.42.png")

編集画面はこんなかんじです。

![スクリーンショット 2015-01-22 22.59.46.png](https://qiita-image-store.s3.amazonaws.com/0/9928/546cf276-3197-d3f7-b08b-6229570ed7ab.png "スクリーンショット 2015-01-22 22.59.46.png")


ただし、このプラグインでは、例えば以下のことができません。
(というか、JOSM自体で、エラーとして扱われます (^^;))

* 祝日(PH)、の入力
* 第三月曜日、など、第`n``X`曜日、の表現

こうした記述は、自分で値を記載する必要があります。

## 値の書き方の例
opening_hoursタグでは、いくつかの値を、セミコロン (;) でつなぐことによって記載を行います。

その際、後ろに記入した値のほうが優先されます。

と言葉で説明してもなんのことやらわからないと思うので、例をあげます。

```
月曜日-金曜日 10:00-17:00
土日祝 16:00-23:00
```

この場合は、以下のように書きます。
セミコロンで改行していますが、実際には一行で記載します。

```
Mo-Fr 10:00-17:00;
Sa-Su,PH 16:00-23:00
```

一行で書くとこうです。

```
Mo-Fr 10:00-17:00; Sa-Su,PH 16:00-23:00
```

## 曜日などの記載についての対応表

曜日を英語で記載する際に、3文字ではなく2文字であらわすのはあまりピンとこないかもしれませんので、対応表を置いておきます。

> ちなみにこれは海外でも同じ状況らしく、Tagging MLでも以前、"なんで3文字にしないの？"という質問がでていました。まぁ、そういうものだ、と割り切るしか無いです、はい。

|日本語|英語|opening_hoursでの値|
|:--|:--|:--|
|月曜日|Monday|Mo|
|火曜日|Tuesday|Tu|
|水曜日|Wednesday|We|
|木曜日|Thursday|Th|
|金曜日|Friday|Fr|
|土曜日|Saturday|Sa|
|日曜日|Sunday|Su|
|祝日|Public Holiday|PH|

## 値が正しいかどうかのチェック
この記法が正しく書けているかどうかは、ウェブ上で公開されているバリデータでチェックが可能です。

* [opening_hours evaluation tool](http://ypid.de/~osm/evaluation_tool/)

非常に有用なツールなので、手入力で複雑な値を組み立てる場合にはここでチェックしながら記述することをお勧めします。


## よくある複雑な例
### 病院・クリニックの例
水曜日や木曜日のみ別の開店時間で、日曜・祝日がお休みというパターンです。

![2015-01-08 11.23.40.jpg](https://qiita-image-store.s3.amazonaws.com/0/9928/61f2d5c2-4a07-d67e-6d5d-7c005439f7f3.jpeg "2015-01-08 11.23.40.jpg")


文字に起こすとこうですね。

```
月曜日〜水曜日: 08:30-11:30, 16:00-18:30
水曜日: 定休
金曜日: 08:30-11:30, 16:00-18:30
土曜日: 08:00-11:00
日曜日・祝日: 定休
```

この場合、こう書きます。

```
Mo-fr 08:30-11:30, 16:00-18:30;
We off;
Sa 08:00-11:00;
Su, PH off
```

off、の部分はまとめることもできます。
記述の順番は、後ろに書くほうが有効(前に書いた記述を上書き)するので、特殊であればあるほど後ろに書くと良いでしょう。

```
Mo-fr 08:30-11:30, 16:00-18:30;
Sa 08:00-11:00;
We,Su,PH off
```

[バリデータサンプル](http://ypid.de/~osm/evaluation_tool/?EXP=Mo-fr%2008%3A30-11%3A30%2C%2016%3A00-18%3A30%3B%20Sa%2008%3A00-11%3A00%3B%20We%2CSu%2CPH%20off&DATE=1421836560000&lat=48.7769&lon=9.1844&mode=0)

### 第三月曜日、などの指定
第三月曜日、など、第`n``X`曜日、の表現、です。

ちょっとサンプルの写真が見つからなかったので、[札幌の呑み屋さんのページ](http://www.otowa-net.com/kouraku/)から拝借します。

文字に起こすとこうですね。

```
営業時間
ランチタイム　11:00-14:00（13:30LO）
ディナータイム　17:00-22:00（21:30LO）
定休日
第2・第4月曜日 
```

この場合、こう書きます。

```
11:00-14:00, 17:00-22:00;
Mo[2,4] off
```

曜日のテキスト部分を省略すると、月曜日から日曜日まですべて、の意味になります。

また、`[ ]`で囲う部分をマイナスにすると、月終わりから起算して第`n``X`曜日を計算します。
月内最終週のみお休み、という場合に使います。こういうかんじですね。

```
11:00-14:00, 17:00-22:00;
Mo[-1] off
```

### 夜の00:00を超える場合の表現
夜の00:00を超える場合の表現です。
ラーメン屋さんや居酒屋など、よく見かけますね。

例えば、名古屋にあるラーメン屋さんの例をみてみましょう。

![2015-01-22 22.14.21.jpg](https://qiita-image-store.s3.amazonaws.com/0/9928/ae7e9f72-ed56-640c-96c1-fe39925b67d8.jpeg "2015-01-22 22.14.21.jpg")


文字にしてみると、こうです。

```
AM 11:00-翌AM2:00 <<スープ売り切れまで>>
```

この場合、26:00と記載してもかまいませんし、24:00でいったん切って、00:00から次の時間帯を開始してもかまいません。
26:00で記述する場合、以下のようになります。

```
Mo-Su 11:00-26:00
```

24:00でいったん切って表現する場合、以下のようになります。

```
Mo-Su 00:00-02:00, 11:00-24:00
```

ただ、よく見てみると、`スープ売り切れまで` という指定が行われています。
これは大切な情報です。ラーメン好きであれば欠かせない情報でしょう :)

この場合、コメントの機能を利用します。`" "`を使って、テキスト文字列で指定します。

```
Mo-Su 11:00-26:00 "スープ売り切れまで"
```

コメントでの記法は他にも、"要予約" "不定休" などの情報を残すときにも使うことができます。

[バリデータサンプル](http://ypid.de/~osm/evaluation_tool/?EXP=Mo-Su%2011%3A00-26%3A00%20%22%E3%82%B9%E3%83%BC%E3%83%97%E5%A3%B2%E3%82%8A%E5%88%87%E3%82%8C%E3%81%BE%E3%81%A7%22&DATE=1421836560000&lat=48.7769&lon=9.1844&mode=0)


### 夏期・冬期だけ営業時間が変化
キャンプ場や牧場などは、夏期と冬期で営業時間が異なる場合があります。

例えば、[成田ゆめ牧場](http://www.yumebokujo.com/about-open.html)が該当します。

```
平日: 09:00〜17:00
12月、1月、2月の平日: 10:00～16:00
土日祝: 09:30〜17:00
冬休み期間中（12/27～1/4）: 09:30～17:00
```

この場合、月を指定することが可能です。
Dec-Febで、12月から2月、という意味になります。

```
09:00-17:00;
Dec-Feb Mo-Fr 10:00-16:00;
Dec-Feb Sa-Su,PH 09:30-17:00;
Dec 27-31,Jan 1-4 09:30-17:00
```

[バリデータサンプル](http://ypid.de/~osm/evaluation_tool/?EXP=09%3A00-17%3A00%3B%20Dec-Feb%20Mo-Fr%2010%3A00-16%3A00%3B%20Dec-Feb%20Sa-Su%2CPH%2009%3A30-17%3A00%3B%20Dec%2027-31%2CJan%201-4%2009%3A30-17%3A00&DATE=1420203900000&lat=48.7769&lon=9.1844&mode=0)


### 日の出、日没
日の出や日没を基点にすることも可能です。
sunrise, sunset, dawn, dusk、という文字列で指定します。

緯度経度を元に日の出と日没の時間計算を行っており、計算が行えない場合のデフォルト値は、払暁(dawn)が5:30、日の出(sunrise)が06:00、日没(sunset)が18:00、夕闇(dusk)が18:30になっています。

あまり見かけない指定ですが、僕の観測範囲だけでも、日本で2−3例ほど確認されています。
こういうかんじです。

![IMAG3251.jpg](https://qiita-image-store.s3.amazonaws.com/0/9928/477fc10f-9510-744a-b85b-3da48a40d78e.jpeg "IMAG3251.jpg")

```
営業時間
あさ9時より日没
```

opening_hoursで記載する場合、このようになります。

```
09:00-sunset
```

#### 日没後30分、の指定
日没関連でゆけば、他にも例えば[島根県立美術館](http://www1.pref.shimane.lg.jp/contents/sam/ja/information/nichibotsu.html)では、閉店時間が `日没 30分後` とされています。
その場合、 `(sunset + 00:30)` という風に指定すると、30分後、を表現できます。

```
【3月～9月】 10:00～日没後30分 （展示室への入場は日没時刻まで）
【10月～2月】 10:00～18:30 （展示室への入場は18：00まで）
```

opening_hoursの記述ではこうです。

```
Mar-Sep 10:00-(sunset+00:30);
Oct-Feb 10:00-18:30
```

[バリデータサンプル](http://ypid.de/~osm/evaluation_tool/?EXP=Mar-Sep%2010%3A00-%28sunset%2B00%3A30%29%3B%20Oct-Feb%2010%3A00-18%3A30&DATE=1421836560000&lat=48.7769&lon=9.1844&mode=0)

詳しい解説は [Github](https://github.com/ypid/opening_hours.js)にあります。
> To calculate the correct values, the latitude and longitude are required which are included in the JSON returned by [Nominatim] (see in the [Library API][ohlib.library-api] how to provide it). The calculation is done by [suncalc][].


## opening_hoursで表現できない定義
日本で行われているいくつかの慣習については、対応することができていません。

これは本家のパーサでの実装が必要です。

* [振替休日](http://ja.wikipedia.org/wiki/%E6%8C%AF%E6%9B%BF%E4%BC%91%E6%97%A5)
* [ハッピーマンデー制度](http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%83%94%E3%83%BC%E3%83%9E%E3%83%B3%E3%83%87%E3%83%BC%E5%88%B6%E5%BA%A6)
* お盆・正月などのイベント (イベントとしてイースターの定義があるので、その拡張)

## 24時間営業の場合
コンビニなどですね。

この場合、以下のように記述します。最も簡単な記法なので、これだけでもぜひ入力しましょう！

```
opening_hours = 24/7
```


## 参考文献
より詳しい情報は、OSMのwikiページと、Githubの記述が参考になります。

* [OSM wiki: opening_hours](http://wiki.openstreetmap.org/wiki/Key:opening_hours)
* [opening_hours記法定義](http://wiki.openstreetmap.org/wiki/Key:opening_hours/specification)
* [Github](https://github.com/ypid/opening_hours.js)