minicalendar.inc.php

Last-modified: Tue, 07 Nov 2017 11:30:15 JST (2353d)
Top > minicalendar.inc.php

minicalendar.inc.php

サマリメニューバーに出すためのカレンダー
リビジョン1.20.1
対応バージョン1.4.4plus
投稿者みこ
投稿日2004-01-31 (土) 11:03:35

概要

 基本はcalendar2といっしょ。左メニューにいれるために、スタイルを追加したり修正したりしています。

使い方

 calendar2 と特に変わりはありません。

備忘録

init.php

define('LOCALZONE', date('Z'));
define('UTIME', time() - LOCALZONE);
define('MUTIME', getmicrotime());

pukiwiki.ini.php

switch (LANG) { // or specifiy one
case 'ja':
        define('ZONE', 'JST');
        define('ZONETIME', 9 * 3600); // JST = GMT + 9
        break;
default  :
        define('ZONE', 'GMT');
        define('ZONETIME', 0);
        break;
}

今回の場合

$today = getdate(mktime(0, 0, 0, $mon, $now_day, $yr) - LOCALZONE + ZONETIME);
SGT - SGT変位 + JST変位 : 現地時間   - 現地時間変位  + 設置者時間変位
JST - JST変位 = UTC    : 設置者時間 - 設置者時間変位 = UTC
UTC + JST変位 = JST    : UTC      + 設置者時間変位 = 設置者時間
  • get_date
    lib/func.php 内で定義されており、ZONETIMEおよびUTIMEの利用により、 この関数経由で取得した日付は、timezone を考慮した値となるため、LOCALZONE + ZONETIMEの部分を消しても影響がでない。考慮が無いような場合には、安易にこの対応をとるわけにもいかない。

コメント

  • public_holiday を使っているようですが、require_once が無いので、難儀していたサイトを見かけましたよ。 -- upk 2004-08-13 (金) 21:48:50
  • コメントありがとうございます。minicalendar/minicalendar_viewerは1.x.1よりPlus!専用になっています。上記情報が古くてごめんなさい。 -- みこ 2004-08-14 (土) 07:15:21
  • ちなみに、PukiWiki Plus!でのセットでしか提供していないはずですが・・・ -- みこ 2004-08-14 (土) 07:16:01
  • pukiwiki-1.4.4plus_rc1p2 の玉を見ましたが、lib に入っているんですね。同じ lib 内でも、属性に 755 と 644 とが入り乱れていますね。-- upk 2004-08-15 (日) 02:25:44
  • はい、これはテスト版ということでスナップショットそのままにしています*1。正式リリース時には本家と同じにしようとおもっています。 -- みこ 2004-08-15 (日) 07:50:03
  • ちなみに本家も make_link.php など入り乱れているのは何故かしっていたらおしえてもらえますか?(なにか経緯があるのかな?) -- みこ 2004-08-15 (日) 07:51:20
    • 残念ですが、知りません。カラーls とかで見慣れている人にとっては、緑で表示されると、実行属性が付いていると一見して分かりますが、そうではない環境だと、ls -l までするか?でしょうから、気が付かないんですかね? -- upk 2004-08-15 (日) 15:08:30
  • 私は、Firefoxなので、calendar2 で良いんですけど、IEだと日付が縦表示してしまって(DOCTYPEのあれですけど)で汚いので、Plusじゃないのに、実は、この minicalendar を利用させています。プラグインだけの単体配布ってしないんですか? -- upk 2004-08-15 (日) 15:13:29
    • なるほど、以外にminicalendarって使いたいという方は多かったんですね 単体配布は public_holiday の扱いと改造分をどうするか迷ったので、Plusで出るまで公開していなかったんですよぉ (わたし自身はPlus!のとおり、init.php に public_holiday をrequire していたので・・・) -- みこ 2004-08-15 (日) 20:29:25
  • カレンダーの上部中心に表示される calendar2 だとページ名な部分は、minicalendarだとページを表示しませんので、実体があっても参照しないため、いじって使っています。まぁ、minicalendar_viewer のために、minicalendar を作った。という感じなんですよね? -- upk 2004-08-15 (日) 15:19:52
    • minicalendar / minicalendar_viewer はわたしのサイトのモノポリーのコーナーみたいなことをしたかったのと、見るだけの人は viewer のページ名をクリックして編集モードになるため混乱する人が多いので現在の仕様にしてあります。(本来はさらに曜日を表示しようとおもったのですが・・・) -- みこ 2004-08-15 (日) 20:38:35
    • ちなみに、まずminicalendarの方が先にできていたんですけどね (作った当時はcalendar2の改造としてだったので・・・) -- みこ 2004-08-15 (日) 20:42:02
  • 私はMenuBarにカレンダーを表示する時はCSSの子要素指定を利用して専用のCSSを与えていました。しかし、MS-IEに対応させるにはminicalendarの方が良いですね。使わせて頂きます。 -- sky 2004-09-07 (火) 18:43:19
    • ご使用いただき、ありがとうございます。現在は public_holiday, calendar_viewer に依存している部分があるので、デザインだけで単独で使用すると、ちょっとてこずるかも 面倒だと思ったら PukiWiki Plus!を使ってね(宣伝モード ) -- みこ 2004-09-08 (水) 17:06:32
  • たまたま、設定が済んでいないFirefoxで見ていて気がついたのですが、コンテントネゴでen_usとかが選択されると曜日がずれてしまうようです。ここの開発日記のカレンダーでも5/31が月曜に見えています。 -- 2005-05-29 (Sun) 17:51:37
  • ちょっと確認してみます。 -- upk 2005-05-29 (Sun) 18:20:47
  • もしやと思ったんですけど、calendar2 も同じですね。 -- upk 2005-05-29 (Sun) 18:27:34
  • ぱっとみ、LOCALZONE + ZONETIME が怪しいですね。 -- upk 2005-05-29 (Sun) 18:30:39
  • date('Z')は、OSからの戻り値だったので、サーバからみると不変となりましたが、今回は、設置場所に左右されないため、値が変動することから、このような加減算でおかしくなっていますねぇ。でも、なんでわざわざこんな計算していたんだろう。不思議。考慮しなくてもよいはずなので、消したものを後でコミットしておきます。 -- upk 2005-05-30 (月) 16:36:49
  • 対応ありがとうございます。あと、minicalendar_viewも同様の修正が必要なようです。今日の項目が休日色で見えてしまっています。 -- 2005-05-30 (Mon) 01:30:11
  • LOCALZONE は、date('Z') で設定される値なので、常に OS の値(サーバなどの設置に依存)しています。結構、使っている箇所があるので、それを修正するのか?LOCALZONE の設定を変えるのか?ちょっと考えます。状況によっては、これらプラグインも戻して、timezone.php を変更するかもしれません。ちょっとお時間を下さい。 -- upk 2005-05-30 (月) 21:18:00
  • LOCALZONE は、現状として保持しないと、ファイルの物理的なタイムスタンプなどの情報を変更できなくなるため、やはりプラグインを変更するのが良さそうです。 -- upk 2005-05-30 (月) 23:02:08
  • 他のプラグインの状況を確認しましたが、サーバの設置場所に依存した時間をUTCに変換するための細工での利用でしたので、対応していません。もうちょっと確認した方が良いかもしれませんが。 -- upk 2005-05-31 (火) 02:07:53
  • timezone.phpが作られた経緯をよく知らないので見当はずれのことを書いているかもしれないですが、time()もfilemtime()もエポックからの秒数なので、場所に依存していないですよね。「今このページがあるサーバでは~時です」といった内容を表示するような処理以外では、直観的にはLOCALZONEがなくてもよいように思うのですがどうでしょう。PukiWikiのシステムの内部ではUTCで処理しておいて、表示する際にブラウザのlangのタイムゾーンに合わせて変換してやる。と。 -- 2005-05-31 (火) 14:38:32
  • ご指摘の通りの解釈で結構です。ただ、互換性維持のために存在しているとご理解していただければと思います。いっきに修正して、抹殺するのも1つの手ではあります。 -- upk 2005-05-31 (火) 16:03:06
  • timezone.phpがなくって、書かれているブラウザのlangのタイムゾーンって、どうやって判断できるんですか?ぜひ、教えてください。PHP5 だと、似たいよう関数があったと思いますけど、ブラウザが示すlangからオフセットを求めることはできませんでしたけどね。仮にできても、PHP5前提になってしまいますけどね。-- upk 2005-05-31 (火) 16:12:25
  • ブラウザのlangのタイムゾーンを知るのはtimezone.phpでやるしかないように思います。サーバ設置場所の時刻とUTCとの差であるLOCALZONE(この解釈で合ってますよね?)の処理については、なくてもなんとかなるのではないかなあ、と思ったのです。 -- 2005-05-31 (火) 17:07:21
  • さらにソース読んでます。LOCALZONEの値はdate()でブラウザのlangに合わせた時刻を出力させるのに使っているのですね。LOCALZONEもなくすわけにはいかないようでした。。 -- 2005-05-31 (火) 17:48:25
  • 何かひとりで混乱してしまっているようで申し訳ないです。質問なのですが、get_filetime()が返している値はどういう意味だと考えれば良いでしょうか。 -- 2005-05-31 (火) 18:43:45
  • 上記の質問はget_date()のtimestamp引数の意味と読みかえていただいてもよいです。 -- 2005-05-31 (火) 20:38:02
  • 全部の確認ができていませんので、問題がある組み合わせが出てきたら、バグ出しに協力に下さい。過去の経緯は、JSTでしか扱えなかったPukiWiki1.3系で、レンタル鯖なため、取り扱う時間が鯖の現地時間となり、JSTでの表記が出来なかった。というところから、この処理がはじまっています。-- upk 2005-06-01 (水) 02:28:40
  • いまさらながら、http://pukiwiki.sourceforge.jp/dev/index.php?BugTrack%2F169 を読んでいます。UTIME(time()-LOCALZONE)はGMTになっているというように読めますが、time()自体がサーバの設置場所によらず世界中のどの地点でも同じ値になるはずなので、-LOCALZONEの補正は不要なのではないでしょうか? -- 2005-06-01 (水) 13:28:56
  • まずは、手を動かして見ましょう。すっきりするはずです。-- upk 2005-06-01 (水) 20:55:10
  • すみませんが、おっしゃっている意味がわかりません。私が書いていること、どこか間違っているでしょうか? -- 2005-06-01 (水) 21:17:57
    • time()自体がサーバの設置場所によらず世界中のどの地点でも同じ値になるはずの箇所なんですけどね。マニュアルベースだとdate()のタイムスタンプが与えられない場合は、現在のローカル時刻が使われます。つまり、timestampはオプションであり そのデフォルト値はtime()の値です。とあります。即ち、time()=現在のローカル時刻とあり、time()の現在時刻をUTIME(オフセット)で戻す。につながります。でも、こんな行間みたいなところを読むよりも、手を動かせば、もっと簡単に、はっきりと理解できたと思うんですよねぇ。ということで、机上だけで悩んでいませんか?ということなんです。-- upk 2005-06-01 (水) 22:45:09
  • 確認した結果、time()は世界中どこの地点でも同じ値になると書いているのですが。 -- 2005-06-01 (水) 23:36:24
    • 私は海外サーバにはアクセスできないので、foo.php:
      time: <?php echo time();?>
      date: <?php echo date('r');?>
      を作って、
      TZ=Asia/Tokyo php -f foo.php; TZ=Europe/Paris php -f foo.php
      とか実行しました。結果は以下のとおり。
      time: 1117637288
      date: Wed, 01 Jun 2005 16:48:08 +0200
      time: 1117637288
      date: Wed, 01 Jun 2005 23:48:08 +0900
      timeの値は同じですがdateの値が変化してるので、PHPはローカルタイムゾーンを東京とパリだと認識していると思います。
  • おぉ、それは失礼しました。いい実行結果じゃないですか。では、貴方なら、どこをどう修正しておくと最適かと思いますか。-- upk 2005-06-02 (木) 00:08:44
  • あと、せっかく気が付いたんですから、貴方が pukiwiki.dev:BugTrack2に計上しておくのが良いと思います。-- upk 2005-06-02 (木) 00:17:54
  • なるほど。time() と date() は違うのですね 勉強になります_(__@)_ -- みこ 2005-06-02 (木) 12:02:37
  • すでに開発談義でも話が始まっているみたいですね。pukiwiki.dev:BugTrack2/76に立てました。ご利用ください(というか、PukiWiki&PHP歴1.5週間の私が話を進めるのは非常に辛いです)。 -- 2005-06-03 (金) 09:57:35
    • ありがとうございます これ以降はそちらで進めます。修正する方向性が確定しないのでちょっと時間がかかるかもしれませんが、ご了承ください_(__@)_ -- みこ 2005-06-03 (金) 13:09:11
  • tb.inc.php を見たんですが、date() をダイレクトコーディングしちゃっていました。いずれにしても、本家の動きと I18N化とでは、問題解決のスピード感が違うはずなので、こちら側で先行対応することになると思っています。本家記載の通り、I18Nでのローカル時間を考慮していない状況では、あくまでも冗長にすぎませんが、I18Nでのローカル時間に緋も付けると、おかしい時間を表示することになるのでバグとなりますからね。
      0
      1
      2
      3
      4
    
    <?php
    $time = time();
    $zone = date('Z');
    echo date("Y-m-d H:i:s\n", $time);
    echo gmdate("Y-m-d H:i:s\n", $time+$zone);
    ?>
    と、date()をgmdate()にして、その時間にZONEのオフセットを加算することで、自前のローカル時間を求めるようにすれば、OSに左右されない現地時間が求まるって、ように修正しようと思います。-- upk 2005-06-04 (土) 15:52:09
  • クライアント側のタイムゾーンに合わせてやるならgmdate("...", $time + ZONETIME)ですよね。クライアント側のタイムゾーン向けのclient_date()とclient_getdate()とかはひとまず用意するのが良いのではないでしょうか。 -- mok 2005-06-04 (土) 21:30:04
  • クライアントのタイムゾーンに合わせたいと思う場面はそれなりにあるようでhttp://www.webmasterworld.com/forum13/3922.htmなんかではJavaScript使ってますね。これが確実なんでしょうけど、日付表示する個所すべてがJavaScriptになってるなんてのはあんまりですよねえ。。 -- mok 2005-06-04 (土) 21:32:41
  • upk:国際化/TimeZoneに、ちょっと書いていますが、この変数っていいですよねぇ。-- upk 2005-06-07 (火) 01:46:06
  • minicalender_viewer 10月=octoverになってる(octoberに) -- 2005-10-19 (水) 13:36:50
    • きゃーはずかしい・・・ 修正しました (Revision:724, 725) -- みこ 2005-10-19 (水) 15:58:44
  • 各ページを日付け付きで作成したいのですが、SideBarに
    #minicalendar
    と書くと、 Foo/2006-01-01 => (2006-07-07クリック) => Foo/2006-01-01/2006-07-07 のように、日付けがネストされて行きます。

以下の修正で日付けのネストが回避できることが判りましたが、これは本来の使い方からするとどうなのでしょうか?

$ diff -Bbwu minicalendar.inc.php.orig  minicalendar.inc.php 
--- minicalendar.inc.php.orig     2006-07-08 02:01:47.000000000 +0900
+++ minicalendar.inc.php 2006-07-08 00:18:55.000000000 +0900
@@ -41,6 +41,8 @@
        }
        $r_base = rawurlencode($base);
        $s_base = htmlspecialchars($base);
+       $d_prefix = $prefix;
+       $prefix   = ereg_replace("/[0-9]{4}-[0-9]{2}-[0-9]{2}/?$","/",$d_prefix);
        $r_prefix = rawurlencode($prefix);
        $s_prefix = htmlspecialchars($prefix);
  • なりお? 2006-07-08 (土) 02:22:01
  • minicalendar_viewerへの要望なのですが、「先月以前を表示する」オプションが欲しいです。
    理由はあまり頻繁に書いていないので、当月のページがないと何も表示されないので、viewerを2回呼んで以前のものを表示させているのですが、それをすると当月に記事がある場合に同じ記事が表示されてしまうのです
    要望はここじゃないとか、受けてないとか、いい方法があるよとかあったらお願いします。 -- ひで? 2006-08-28 (月) 13:16:48
  • こちらのサイトのみたいに日記ページに#minicalendar_viewer(開発日記,6,past)って書き込んでトップページでincludeしてみては?(トップページに読込まなくてもリンクを張るだけでも良い) -- taru 2006-08-28 (月) 15:18:23
  • 反応遅くすみません。その手がスマートぽいですね。ありがとうございました  -- ひで? 2006-09-06 (水) 23:15:24