旧暦や六曜など日付に関する情報を取得できるAPIを作ってみた

2015/06/19 Others Data

指定した日付に関する様々な(「今日は何の日」的な)情報を取得するシンプルなAPIを(自分のために)作ってみた。

例えば「今日の六曜(大安とかそういうの)は?」といった場合、まずは旧暦の日付を求める必要がある。
旧暦の計算なんかはすごく面倒くさいため、単に六曜を表示するだけでも大掛かりっぽくなってしまう。
しかもそういったAPIがみつからなかったので、もう作ってしまえということで。

エンドポイント

https://dateinfoapi.appspot.com/v1

「http」(「s」なし)でもOK。

リクエストパラメータ

JSONPを使用しない場合、Access-Control-Allow-Originを * に設定しているため直接取得できると思います。

パラメータ 説明
date 日付 (例)2015-06-19
省略時は現在の日になります。
※ Pythonの dateutilライブラリを使用しているので、dateutilライブラリがパースできる形式ならなんでもOKです。
※ 1900年以降にしか対応していません。
callback JSONPで取得する際に使用してください

リクエスト例

通常
https://dateinfoapi.appspot.com/v1?date=2015-06-19

JSONPの場合
https://dateinfoapi.appspot.com/v1?date=2015-06-19&callback=function_name

レスポンスパラメータ

レスポンスのフォーマットはJSONのみです。値がない場合は null が入ります。

パラメータ 説明
century integer 指定日が何世紀か
(例)21
date string 指定日の日付(YYYY-MM-DD形式)
(例)2015-06-19
date_ja string 指定日の日本語の日付(YYYY年M月D日(W)形式)
(例)2015年6月19日(金)
day integer 指定日の日
(例)19
eto string 指定日の干支
(例)未
eto_kana string 指定日の干支のよみがな
(例)ひつじ
gengo string 指定日の元号
(例)平成
gengo_full string 指定日の元号に年を加えたもの
(例)平成27年
holiday string 指定日が国民の休日の場合はその名称
(例)みどりの日
julian float 指定日のユリウス日
(例)2457192.5
month integer 指定日の月
(例)6
month_en string 指定日の月の英名(すべて小文字)
(例)june
month_ja string 指定日の月の陰暦名
(例)文月
month_end integer 指定日の月の月末日
(例)31
moon integer 指定日の月相(月齢)数。0~27(28でないことに注意)の数値。
(例)2
moon_en string 指定日の月相の状態を英語で。
該当しない場合は null
(例)New Moon
moon_ja string 指定日の月相の状態を日本語で。
該当しない場合は null
(例)新月
old_date string 指定日から算出した旧暦の日付(YYYY-MM-DD形式)
(例)2015-05-04
old_year integer 指定日から算出した旧暦の年
(例)2015
old_month integer 指定日から算出した旧暦の月
(例)5
old_date integer 指定日から算出した旧暦の日
(例)4
old_leap boolean 指定日から算出した旧暦が閏月かどうか
(例)false
rokuyo string 指定日の六曜
(例)友引
season_en string 指定日の季節を英語で(全て小文字)
※季節の分け方は気象庁が決めている区分です。
(例)summer
season_ja string 指定日の季節を日本語で(全て小文字)
(例)夏
sunrise string 指定日の日の出の時刻(YYYY-MM-DD HH:MM:SS形式)
(例)2015-06-19 04:25:21
sunrise string 指定日の日の入りの時刻(YYYY-MM-DD HH:MM:SS形式)
(例)2015-06-19 18:59:44
timezone string 日付計算のタイムゾーン(「JST」固定)
(例)JST
week integer 指定日の曜日番号(0=日曜、1=月曜...)
(例)5
week_en string 指定日の曜日を英語で(すべて小文字)
(例)friday
week_ja string 指定日の曜日を日本語で
(例)金
week_number integer 指定日がその月の第何曜日かの番号。
例えば week_number が「3」で week_ja が「金」なら「第3金曜日」
(例)3
week_number_of_year integer 指定日の週番号(その年の最初の日曜日から数えて第何週目か)
(例)24
year integer 指定日の西暦での年
(例)2015
year_ja integer 指定日の和暦での年
(例)27
_now json リクエスト時点の日時の情報

レスポンス例

※見やすいように整形しています。実際は改行なしです。

{
    "century": 21,
    "date": "2015-06-19",
    "date_ja": "2015年6月19日(金)",
    "day": 19,
    "eto": "未",
    "eto_kana": "ひつじ",
    "gengo": "平成",
    "gengo_full": "平成27年",
    "holiday": null,
    "julian": 2457192.5,
    "month": 6,
    "month_en": "june",
    "month_end": 31,
    "month_ja": "文月",
    "moon": 2,
    "moon_en": null,
    "moon_ja": null,
    "old_date": "2015-05-04",
    "old_day": 4,
    "old_leap": false,
    "old_month": 5,
    "old_year": 2015,
    "rokuyo": "友引",
    "season_en": "summer",
    "season_ja": "夏",
    "sunrise": "2015-06-19 04:25:21",
    "sunset": "2015-06-19 18:59:44",
    "timezone": "JST",
    "week": 5,
    "week_en": "friday",
    "week_ja": "金",
    "week_number": 3.0,
    "week_number_of_year": 24,
    "year": 2015,
    "year_ja": 27,
    "_now": {
        "date": "2015-06-19",
        "datetime": "2015-06-19 06:20:13",
        "day": 19,
        "hour": 6,
        "minute": 20,
        "month": 6,
        "second": 13,
        "week": 5,
        "week_en": "friday",
        "week_ja": "金",
        "year": 2015
    }
}

あとがき

基本的に放置したいのと、SSLが使いたかったのでGoogle App Engineを使った。
しかも完全無料でやるために、普段はPHPなんだけど慣れないPythonで組んだので少し時間がかかったw。

  • 旧暦の計算は銀月の符号さんのプログラムを使った。
    (六曜は旧暦から取得した日付から (月 + 日) % 6 で算出)
  • 祝日の取得にはPython 用祝日判定コードを使わせてもらった。
    一部動かない部分があったので import datetime の部分を
    import datetime, math, sys に変更した。
  • 月相(月齢)の計算には Astral を使った。 PyEphem というのが精度がいいみたいだけどGAEでは動かなさそうだった。
  • 最も苦戦したのが「指定日がその月の第何曜日か」の部分。「第○曜日が何日か」の算出はたくさん見つかるんだけど、その逆がなかなか思いつかなくてw
    結局 ceil((日 + 7 - 曜日) / 7) という簡単なことだった。
comments powered by Disqus