プログラマブログ

by wacul

menu

2014.07.07日付の繰り返しルールに便利なRRULEを使う

RRULEとは

予定を記録するようなカレンダーアプリは、「毎週月曜日の10時から会議」のような繰り返しの予定を設定できる必要があります。 例えば、Googleカレンダーでは以下の画像のように、繰り返しの間隔、曜日、開始日、終了日、など細かに設定できます。

Googleカレンダーの繰り返しの予定の設定画面

このような繰り返し設定をデータとして保存するのに有用な形式がRFC2445で定められているRRULEです。

  • RRULEの書式の例(毎週月曜日10時からの予定を 2014/6/25 から 2014/12/31 まで繰り返す)
1
"FREQ=WEEKLY;BYDAY=MO;DTSTART=20140625T010000Z;UNTIL=20141230T150000Z"

JavaScriptでRRULEを扱う

waculではnode.jsで自社サービスのサーバサイドを開発しているので、node.jsからRRULEを扱う例を紹介します。
jakubroztocil/rrule を使うと簡単にできます(サーバサイドでもクライアントサイドでも動きます)。

先ほどの例の「毎週月曜日10時からの予定を 2014/6/25 から 2014/12/31 まで繰り返す」を行います。
生成の仕方は2通りあります。
まず、以下のようにRRuleを生成するときに引数として渡す方法です。

1
2
3
4
5
6
7
var RRule = require('rrule').RRule;
var rule = new RRule({
    freq: RRule.WEEKLY,                       //毎週
    byweekday: [RRule.MO],                    //月曜日
    dtstart: new Date(2014, 5, 25, 10, 0),    //2014/06/25 から 10:00 始まりで
    until: new Date(2014, 11, 31)             //2014/12/31 まで
});

次に、RRULEの書式から生成する方法です

1
2
var RRule = require('rrule').RRule;
var rule = RRule.fromString('FREQ=WEEKLY;BYDAY=MO;DTSTART=20140625T010000Z;UNTIL=20141230T150000Z');

このようにして、生成したRRULEのオブジェクトをルールに則って出力します。出力結果はJavaScriptのDate型の配列になります。

1
2
3
4
5
6
7
8
9
10
11
rule.all();

//実行結果
[ Mon Jun 30 2014 10:00:00 GMT+0900 (JST),
  Mon Jul 07 2014 10:00:00 GMT+0900 (JST),
  Mon Jul 14 2014 10:00:00 GMT+0900 (JST),
  Mon Jul 21 2014 10:00:00 GMT+0900 (JST),
  Mon Jul 28 2014 10:00:00 GMT+0900 (JST),
  Mon Aug 04 2014 10:00:00 GMT+0900 (JST),
  Mon Aug 11 2014 10:00:00 GMT+0900 (JST),
  Mon Aug 18 2014 10:00:00 GMT+0900 (JST),

上記のRRULEのオブジェクトから逆にRRULEの文字列を取得する方法は以下です。
この文字列を日付の繰り返しルールとしてDBに保存しておきます。

1
2
3
4
rule.toString();

//実行結果
FREQ=WEEKLY;BYDAY=MO;DTSTART=20140625T010000Z;UNTIL=20141230T150000Z

日付の繰り返し処理を扱うのはなかなか骨が折れる作業なので、RRULEを扱えるこのようなライブラリが用意されているのは非常に助かります。

ちなみにカレンダーアプリのようなものを実装する際はGoogleカレンダーのAPIを試してみると参考になります。
Google API ExplorerからCalendar API を選択し、 この中にあるcalendar.events.list APIを呼び、その結果を見るとわかりやすいです。
Googleカレンダーでは以下のURLにある「Recurring events」の項目としてRRULEを保存しています。
Google Apps Calendar API Concepts and Use Cases

この記事を書いた人enokido

榎戸です。趣味ではゲームを作っています。

waculでは、プログラマを募集しています。

現在はプロダクトとして、課題発見から改善提案まで自動で行うWeb改善プラットフォーム「AIアナリスト」を開発中です。

waculの採用情報へ

ページトップへ