アーカイブ

‘カレンダー’ タグのついている投稿

曜日が変わらないカレンダーをJavaScriptで

2012 年 1 月 19 日 コメントはありません

曜日が変わらないカレンダーについて書きましたが、これをJavaScriptのユーザー定義関数にしてみました。
JavaScriptの通常の日付(日付オブジェクト、ndate)を与えると「ハンキ・ヘンリー・パーマネント・カレンダー」における日付(文字列、pdate)に変換します。
返る値は「2012-1-19」という形式です。
使い道が思い当たりませんが。

function date2hhpc(ndate) {
    var di, ldi, preldi, y, ydi, isext, sdi, pdate;
    di = (ndate - (new Date(2012, 0, 1))) / 86400000; //日のインデックス。2012-01-01(初日)を0日目とする
    if (di < 0 || di > 20453) { //対応しているのは2012年から2167年まで
        return ("error");
    }
    ldi = -1; //大晦日のインデックス
    year = 2011;
    while (di > ldi) {
        year++;
        preldi = ldi; //前年の大晦日
        isext = String(year).match(/(2015|2020|2026|2032|2037|2043|2048|2054|2060|2065|2071|2076|2082|2088|2093|2099|2105|2111|2116|2122|2128|2133|2139|2144|2150|2156|2161|2167)/) ? 1 : 0;
        ldi += 364 + isext * 7;
    }
    ydi = di - preldi - 1;
    if (ydi > 363) {
        pdate = "E/" + (ydi - 363);
    } else {
        sdi = ydi % 91;
        x = Math.floor(sdi / 30) + 1;
        x = (x > 3) ? 3 : x;
        pdate = (Math.floor(ydi / 91) * 3 + x) + "-" + (sdi - 30 * (x - 1) + 1);
    }
    return (year + "-" + pdate);
}

曜日が変わらないカレンダー

2012 年 1 月 19 日 コメントはありません

毎年、曜日が変わらないカレンダーが紹介されていました。
[曜日が変わらない「合理的な新しい暦」 ≪ WIRED.jp 世界最強の「テクノ」ジャーナリズム]

このカレンダーは発案者の名前から「ハンキ・ヘンリー・パーマネント・カレンダー」と名付けられています。

  • 毎年1月1日が日曜日から始まる。
  • 年間364日。1月は30日まで、2月は30日まで、3月は31日まで、以下同様に12月まで。
  • 何年かに一度、「追加週」を7日間、加える。曜日はずれず、これにより公転周期とのずれが修正される。

メリットは年によって曜日がずれないので毎年、同じスケジュールが使えるということ。確かに毎年、同じようなことをやっているのに、スケジュールの見直しをしていますが、これが不要に。
特に元日やクリスマスが日曜日に固定されるので仕事に支障をきたすことがありません。

カレンダー以外の主張としては、「時差を気にせず、世界中で、世界標準時を使おう」というのがあります。
「正午にキックオフ(日本時間午後9時)」という表記、注釈は不要です。この場合、日本でも『12時』にキックオフです。「午前9時から午後5時まで」は『0時から8時まで』となります。

素晴らしいアイディアですが、気になる点があります。

  • 給与はどうするのか?通常は月給だと思いますが追加週のある年は給与も追加されるのでしょうか。もっとも現行のカレンダーでも30日までの月と31日までの月は同じ給与で誰も文句は言いませんが。
  • 世界中で世界標準時を使うと、勤務時間が『23時から7時まで』の場合、勤務日は当日なのか、翌日なのか?「昨日」や「明日」も安易に使えません。一々『15日の23時』などと日付を付けないと危ないかもしれません。

曜日の変わらないカレンダーと言うことならば、こんなカレンダーはどうでしょうか。

  • 毎年1月1日が日曜日から始まる。
  • 各月の日数は現行と同じ。
  • 2月は固定して29日までとする。12月は通常は30日、閏年は31日までとする。

この方式だと2012年のカレンダーがそのまま使えます。
現行のカレンダーは、閏年の調整を2月という半端な位置で行うのが、問題の一つだと思います。これを12月の最後に行えばよいでしょう。日本ならば、どうせ年末で休むのだから。
今年だと12月30日が日曜日、31日が月曜日、翌年1月1日が日曜日、となります。2013年のカレンダーは12月31日がなくなるだけ。

カテゴリー: 小ネタ タグ: , ,

飲酒カレンダー

2012 年 1 月 10 日 コメントはありません

私の飲酒の状況を表示する「飲酒カレンダー」を作ってみました。
Twitterで「アルコール」や「#twinomi」という文字列を含むツイートを抽出して整形しています。

飲酒カレンダー

今年はアルコールを控えるつもりでしたが、10日間のうち7日も飲んでいました。元日は前日の飲み過ぎで倒れていましたし、2日は車の運転をするため我慢。実質、1日しか休んでいません。


「禁煙セラピー」は効果があったそうですが。

カテゴリー: Twitter タグ: , , ,

2012年は休日が少ない

2011 年 12 月 20 日 コメントはありません

来年のスケジュールを確認していて気になった点が。2012年は休みが少ないんじゃないか?
そこで年別の休日の数を数えてみました。
・週休二日
・祝日の振替休日を反映
という条件でカウントすると下に示す通りになりました。

祝日は現在は15日です。これが土日とどのように重なるかが問題です。
日曜日と重なると振替休日になりますが土曜日と重なると減ります。
実際に数えると休日の数は116日から120日のいずれかになります。
2012年は116日で最も少ないパターンです。
これは土曜日と重なる祝日が4日もあるのが主な原因でしょう。

なお春分の日、秋分の日があるため、「13日の金曜日」のような規則性(28年周期)はないようです。 続きを読む…

カテゴリー: 豆知識 タグ:

PHPを使ってGoogleカレンダーにイベントを追加する

2011 年 9 月 12 日 コメントはありません

GoogleカレンダーがIE6で使えなくなりました。使えないことはないのですがレイアウトがグチャグチャ。
そこで予定を追加する別の方法を探してみました。
見つかったのが次のページ。
PHP アプリケーションから Google カレンダーを利用する

とても詳しく書いてあります。
これを自分なりに解釈して簡略化してみました。

Zendをインストール

Zendというフレームワークを使います。
次のサイトからダウンロードします。
Zend Framework: Downloads: Downloads

解凍して、後述するプログラム本体(PHPファイル)と同じフォルダに「Zend」というフォルダを作り中身をまるごと入れておきます。

プログラム本体

次がプログラム本体です。
実際にはフォームを使うのでしょうが、簡略化してあります。
ページを開くと、ここに書かれたタイトル、開始時刻、終了時刻、場所がイベントとして追加されます。

$title="打合せ";
$start_datetime=mktime(10,30,0,9,15,2011);//2011年9月15日10時30分
$end_datetime=mktime(11,30,0,9,15,2011);//2011年9月15日11時30分
$place="第三会議室";
gcal_add_event($title,$start_datetime,$end_datetime,$place);

イベントを追加する関数

次がイベントを追加する部分です。
$userと$passに自分のGmailのアドレスとログインパスワードを書いておきます。

function gcal_add_event($title,$start_datetime,$end_datetime,$place){
    //自分のGmailアドレスとログインパスワード
    $user = "xxxxx@gmail.com";
    $pass = "xxxxx";

    //クラスをロード
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
    Zend_Loader::loadClass('Zend_Gdata_Calendar');
    Zend_Loader::loadClass('Zend_Http_Client');

    //サービスに接続
    $gcal = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
    $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $gcal);
    $gcal = new Zend_Gdata_Calendar($client);

    //日付時刻をATOM形式に
    $start = date(DATE_ATOM, $start_datetime);
    $end   = date(DATE_ATOM, $end_datetime);

    //イベントを作成し追加
    try {
        $event = $gcal->newEventEntry();
        $event->title = $gcal->newTitle($title);
        $when = $gcal->newWhen();
        $when->startTime = $start;
        $when->endTime = $end;
        $event->when = array($when);
        $event->where = array($gcal->newWhere($place));
        $gcal->insertEvent($event);
    } catch (Zend_Gdata_App_Exception $e) {
        print "エラー: " . $e->getResponse();
    }
    print "イベントを追加";
}
カテゴリー: デジタル タグ: , , ,

Googleカレンダー、インポート用CSVを作成するマクロ

2011 年 2 月 22 日 コメントはありません

Excelシートに作ったGoogleカレンダー用のデータをCSVに変換するマクロです。
出力されたCSVを使ってカレンダーにインポートすることができます。

Excelシート

Excelシートは次のように作ります。
日付と時刻はExcel形式(シリアル値)にします。

x A B C D E F
1 Subject Start Date Start Time End Date End Time Location
2 南アフリカ対メキシコ 2010/06/11 23:00 2010/06/12 01:00 ヨハネスブルク
3 ウルグアイ対フランス 2010/06/12 03:30 2010/06/12 05:30 ケープタウン
4 アルゼンチン対ナイジェリア 2010/06/12 23:00 2010/06/13 01:00 ヨハネスブルク

マクロ

アクティブシートに対して処理されます。
日付と時刻の行はFormat関数で整形されます。
カンマ付テキスト(UTF-8)に変換され、指定したファイル名で保存されます。

Sub Googleカレンダーインポート用CSV出力()
    fnsave = Application.GetSaveAsFilename( _
        "import.csv", "CSV(*.csv),*.csv")
    If fnsave = False Then Exit Sub
    mytext = ""
    i = 1
    Do
        j = 1
        Do
            If Right(Cells(1, j), 4) = "Date" Then
                temp = Format(Cells(i, j), "yyyy/mm/dd")
            ElseIf Right(Cells(1, j), 4) = "Time" Then
                temp = Format(Cells(i, j), "hh:mm")
            Else
                temp = Cells(i, j)
            End If
            mytext = mytext & temp & ","
            j = j + 1
        Loop Until Cells(i, j) = ""
        mytext = Left(mytext, Len(mytext) - 1) & vbCrLf
        i = i + 1
    Loop Until Cells(i, 1) = ""
    mytext = Left(mytext, Len(mytext) - Len(vbCrLf))
   
    With CreateObject("ADODB.Stream")
        .Type = 2
        .Charset = "utf-8"
        .Open
        .WriteText mytext, 1
        .SaveToFile fnsave, 2
        .Close
    End With
End Sub

実行結果

Subject,Start Date,Start Time,End Date,End Time,Location
南アフリカ対メキシコ,2010/06/11,23:00,2010/06/12,01:00,ヨハネスブルク
ウルグアイ対フランス,2010/06/12,03:30,2010/06/12,05:30,ケープタウン
アルゼンチン対ナイジェリア,2010/06/12,23:00,2010/06/13,01:00,ヨハネスブルク
カテゴリー: Excel タグ: , ,

Googleカレンダーのインポートで「終日」を使う

2011 年 2 月 22 日 コメントはありません

以前、GoogleカレンダーにCSVをインポートする方法を書きましたが、今回は「終日」の予定をインポートしてみます。
必要な項目は次の3個です。

  • Subject
  • Start Date
  • All Day Event

「All Day Event」に「TRUE」とセットすることで、予定が「終日」となります。

Subject,Start Date,All Day Event
休暇,2011/4/16,TRUE
カテゴリー: デジタル タグ: , ,

任天堂の卓上カレンダー、2011年版

2010 年 12 月 20 日 コメントはありません

昼間、「今年はまだ任天堂のカレンダーが届かないなあ。今年からないのかなあ」などと考えていました。
帰宅すると届いていました。
カードを差し替える方式の卓上カレンダー。
私はリング式の方が好きなのですが。

カテゴリー: 生活 タグ:

「金土日」が5回ある月

2010 年 10 月 6 日 コメントはありません

今月(2010年10月)は金曜日、土曜日、日曜日が5回あります。
三日続きの週末が他の月よりも多いということになります。
「だから何だ」と言われるかもしれませんが。

1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

2038年1月までの「金土日」が5回ある月をリストアップしてみました。
以後、28年周期で繰り返されます。「13日の金曜日の規則性」で書いたようにカレンダーは28年周期になります。 続きを読む…

カテゴリー: 小ネタ タグ: , ,

「13日の金曜日」の規則性

2009 年 11 月 13 日 コメントはありません

先ほど 「13日の金曜日」一覧を載せましたが、これには規則性があります。

祝日を考慮せず、曜日の並びだけを考えてみると、カレンダーは14種類しかありません。
1月1日が日曜日のものから土曜日までで7種類。
普通の年と閏年で2種類。
この組み合わせで14種類です。
「日曜+普通」、「日曜+閏年」、「月曜+普通」と続いて、「土曜+閏年」まで。カレンダーは14種類のうちのどれかになります。

365日を7で割ると余りは1になりますので、今年の元日が土曜日だとすると来年は日曜日、再来年は月曜日となります。しかし閏年は余りが2なので、このとき、曜日の順番は崩れます。
7と4の最小公倍数は28ですので、曜日と閏年の順番は28年周期になります。
つまりカレンダーの並び順は28年ごとに繰り返されます。
2000年のカレンダーと2028年のカレンダーは全く同じになります。
「13日の金曜日」についても28年周期で同じ月に現れます。

カテゴリー: 豆知識 タグ: