2017/03/02 追記
フォーマットが変わってる(詳しくはこちら)
ちゃんとCSVらしいCSVになってますね…、どうせなら振替休日も追加してよ
みんなやってそうだけど、適当に生PHPで
holiday_ja.php
<?php
date_default_timezone_set('Asia/Tokyo');
setlocale(LC_ALL, 'ja_JP.UTF-8');
// どうしてSSLで提供しないんだ…
$csv_url = 'http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv';
/*
* リクエスト実行
*/
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $csv_url,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
// エラーなら、適当にエラーメッセージ出して終了
if ($response === false) {
header('Content-Type: application/json; charset=utf-8', true, 500);
echo json_encode(['error' => 'Curl error: ' . curl_error($ch)]);
exit;
}
/*
* SJISのCSVをUTF-8として処理する
*/
$buffer = mb_convert_encoding($response, 'UTF-8', 'sjis-win');
$fp = tmpfile();
fwrite($fp, $buffer);
rewind($fp);
$line_number = 0;
$data = [];
while (($row = fgetcsv($fp, 0)) !== FALSE) {
$line_number++;
if ($line_number <= 2) {
// 1行目、2行目はスキップ
continue;
} elseif (empty(array_filter($row))) {
// 空行ならループを終了
break;
}
for ($index = 0; $index < count($row); $index += 2) {
$data[] = [
'date' => date_format(new DateTime($row[$index + 1]), DATE_ATOM),
'name' => $row[$index],
];
}
}
fclose($fp);
array_multisort(array_column($data, 'date'), SORT_ASC, $data);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data);
出力結果
[
{
date: "2016-01-01T00:00:00+09:00",
name: "元日"
},
{
date: "2016-01-11T00:00:00+09:00",
name: "成人の日"
},
~中略~
{
date: "2018-11-23T00:00:00+09:00",
name: "勤労感謝の日"
},
{
date: "2018-12-23T00:00:00+09:00",
name: "天皇誕生日"
}
]
WebAPI的な使い方は想定されていないはずなので、CSVファイルはローカルにダウンロードして処理しようね!
まあ、GoogleカレンダーAPIでおk
よろしくご査収ください