オンラインでのお打ち合わせが可能です。

Blog

Googleカレンダー APIから祝日を取得する方法

20141018

こんにちわマウンテンキング山王です。

祝日の反映しないカレンダーで祝日が分かるようカスタマイズする事があったので
GoogleカレンダーAPIから祝日の情報を取得しました。

今回はそのやり方をご紹介します。

現在使用可能なコード

//Googleカレンダーから祝日を取得
function getHolidays($year) {
	$holidays = array();
 
	//Googleカレンダーから、指定年の祝日情報をJSON形式で取得するためのURL

	$start = $year.'-01-01';
	$end = $year.'-12-31';
	$calendar_id = urlencode('japanese__ja@holiday.calendar.google.com');
	$url = "https://www.google.com/calendar/feeds/{$calendar_id}/public/basic?start-min={$start}&start-max={$end}&max-results=30&alt=json";

	//JSON形式で取得した情報を配列に変換
	$results = json_decode(file_get_contents($url), true);

	//年月日(例:20120512)をキーに、祝日名を配列に格納
	foreach ($results['feed']['entry'] as $value) {
		$date = preg_replace('#\A.*?(2\d{7})[^/]*\z#i', '$1', $value['id']['$t']);			
		$title = $value['title']['$t'];
		$holidays[$date] = $title;
	}
 
	//祝日の配列を早い順に並び替え
	ksort($holidays);
	//配列として祝日を返す
	return $holidays;
}

 

※追記
カレンダーAPIの仕様変更に伴い下記のコードは使用不可になりました。
上記に新しいコードを追記しています。

PHP

function getHolidays($year) {
 $holidays = array();

 //Googleカレンダーから、指定年の祝日情報をJSON形式で取得するためのURL
 $url = sprintf(
 'http://www.google.com/calendar/feeds/%s/public/full?alt=json&%s&%s',
 'japanese__ja%40holiday.calendar.google.com',
 'start-min='.$year.'-01-01',
 'start-max='.$year.'-12-31'
 );

 //JSON形式で取得した情報を配列に変換
 $results = json_decode(file_get_contents($url), true);

 foreach ($results['feed']['entry'] as $value) {
 $date = str_replace('-', '', $value['gd$when'][0]['startTime']);
 $holidays[] = $date;
 }

 //並び替え
 sort($holidays);

 //配列として祝日を返す
 return $holidays;
}

$holiday = getHolidays(2014);

 

実行結果

Array
(
    [0] => 20140101
    [1] => 20140113
    [2] => 20140211
    [3] => 20140321
    [4] => 20140429
    [5] => 20140503
    [6] => 20140504
    [7] => 20140505
    [8] => 20140506
    [9] => 20140721
    [10] => 20140915
    [11] => 20140923
    [12] => 20141013
    [13] => 20141103
    [14] => 20141123
    [15] => 20141124
    [16] => 20141223
    [17] => 20141225
)

 

print_rするとこのような配列が返ってきます。

残念ながらクリスマスは日本では祝日じゃないですね。
リア充の為のイベントですのでここでは省きたいと思います。

array_pop($holidays);

 

Array
(
    [0] => 20140101
    [1] => 20140113
    [2] => 20140211
    [3] => 20140321
    [4] => 20140429
    [5] => 20140503
    [6] => 20140504
    [7] => 20140505
    [8] => 20140506
    [9] => 20140721
    [10] => 20140915
    [11] => 20140923
    [12] => 20141013
    [13] => 20141103
    [14] => 20141123
    [15] => 20141124
    [16] => 20141223
)

あとはこいつらを煮るなり焼くなりしてカレンダーに祝日を
反映させるだけですね。

ちなみに今回の件では必要なかったので省きましたが祝日の名前も取得できます。
以下の様にkeyに日付valueにタイトルを突っ込めば

$title = $value['title']['$t'];
$holidays[$date] = $title;
Array
(
    [20140101] => 元日
    [20140113] => 成人の日
    [20140211] => 建国記念の日
    [20140321] => 春分の日
    [20140429] => 昭和の日
    [20140503] => 憲法記念日
    [20140504] => みどりの日
    [20140505] => こどもの日
    [20140506] => みどりの日 振替休日
    [20140721] => 海の日
    [20140915] => 敬老の日
    [20140923] => 秋分の日
    [20141013] => 体育の日
    [20141103] => 文化の日
    [20141123] => 勤労感謝の日
    [20141124] => 勤労感謝の日 振替休日
    [20141223] => 天皇誕生日
)

日付と祝日名の配列になります。

今日もGoogle大先生ありがとう。
ではまた!!

参考にさせていただいた記事

untenna
サポートサイト
ミトネデザイン