9

jquery カレンダー プラグインをカスタム cms に統合しようとしています。

私の問題は、元の値 (データベース内) が設定された翌日にイベントが表示されることです。

これは私が自分のイベントを取得する方法です:

$query = "SELECT id,avatar, titulo AS title,texto as name, unix_timestamp(start_date) as start,unix_timestamp(end_date) as end, start_date, end_date 
              FROM blogs 
              WHERE (unix_timestamp(start_date) >= '$start' OR unix_timestamp(end_date) <= '$end')
                    AND post_type = 'event'
                    AND lan = '$lan'";
    //echo $query;
    $year = date('Y');
    $month = date('m');
    $result = mysql_query($query);
    $array = array();
    $i = 0;
    while ($row = mysql_fetch_array($result)) {
        $raw = $row;
        $raw['url'] = '/blog/'.urls_amigables($raw['title']).'/'.$raw['id'].'/';
        $raw['start_show'] = prettyDateTime($raw['start_date']);
        $raw['end_show'] = prettyDateTime($raw['end_date']);
        $array[$i] = $raw;

        $i++;
    }
    echo json_encode($array);

そして、これは私がそれらをjqueryカレンダーに表示する方法です:

$('#calendario').fullCalendar({



                        events: "/includes/json-events.php",

                        eventDrop: function(event, delta) {
                            alert(event.title + ' was moved ' + delta + ' days\n' +
                                '(should probably update your database)');
                        },

                        loading: function(bool) {
                            if (bool) $('#loading').show();
                            else $('#loading').hide();
                        },
                        eventMouseover: function( event, jsEvent, view ) { 
                            var item = $(this);
                            var image = '';
                            if(event.avatar != '')
                                image = '<img src="'+event.avatar+'" />';
                            if(item.find('.nube').length == 0){
                                var info = '<span class="nube"><h2>'+event.title+'</h2>'+image+' <p class="text">'+event.name+'</p><p>'+event.start_show+' <br /> '+event.end_show+'</p><p><a href="'+event.url+'">read_more</a></p></span>';
                                item.append(info);
                            }
                            if(parseInt(item.css('top')) <= 200){
                                item.find('.nube').css({'top': 20,'bottom':'auto'});
                                item.parent().find('.fc-event').addClass('z0');
                            }
                            if(parseInt(item.css('left')) > 500){
                                    item.find('.nube').css({'right': 0,'left':'auto'});
                                    item.parent().find('.fc-event').addClass('z0');
                            }
                            item.find('.nube').stop(true,true).fadeIn();
                            console.log(parseInt(item.css('left')));
                        },
                        eventMouseout: function( event, jsEvent, view ) { 
                            var item = $(this);
                            item.find('.nube').stop(true,true).fadeOut();
                        },
                        header: {
                                    left: 'prev,next today',
                                    center: 'title',
                                    right: 'month,agendaWeek,agendaDay'
                                },
                                eventRender: function(event, element) {

                                }

                    });

ここでの問題はunix_timestamp(start_date)、カレンダーで次の日が生成されることです

(例: start_date が 17 日に格納されている場合、カレンダーでは 18 日に表示されます)

そして、私が何を見逃したのかわかりません。これはすべて、仕様に従って作成したものです...

どこで失敗していますか?(jquery、mysql、またはタイムゾーンの設定?)

-編集-

私は一種のそれを修正しました

$row['start'] = $row['start'] - 60*60*24 /* One day */;

だから今start_datestart一緒に意味をなす (カレンダーで...)

より良い解決策を知っていることを教えてください!

4

4 に答える 4

7

チャプターMySQL 5.6 Reference Manualp - 12.7 Date and Time Functionsによると

UNIX_TIMESTAMP() は、その引数が現在のタイム ゾーンの日時値であると想定します。

主な質問:

  • PHP や MySQL と同じタイム ゾーンを使用して、ブラウザー経由で日付がデータベースに挿入されますか?
  • タイムゾーンを考慮せずに日時が挿入されているため、オフセットやエラーが発生していますか?
  • ブラウザの時間は、挿入時と以前のイベントの表示時の両方で考慮されていますか?

アクション/ポイント:

  1. イベント挿入コード (javascript および PHP) を確認する必要があります。
  2. サーバーが動作しているタイムゾーンを確認する必要があります。これは、コンソール コマンド(Linux) を使用するか、PHP で [date_default_timezone_get()] ( http://php.net/manual/en/function.date ) を使用して直接行うことができます。 -default-timezone-get.php ) .
  3. 2 つの異なるビューアーが同じ日時をアップロードする可能性があるため (タイムゾーン コンポーネントなしで)、どのタイムゾーンとブラウザーが配置されているかを検出する必要がありますか?

資力

ブラウザーがどのタイムゾーンにあるかを確認し、これを補正するとともに、イベントを表示するブラウザーを補正する必要があります。

以下は、ブラウザ/PHP/MySQL のタイムスタンプに関連する上記の問題に対処するためのリソースです。

解決

解決策は、すべての挿入に UTC タイムスタンプを使用し、イベント カレンダーを表示するときの視覚化に別のタイムスタンプのみを使用することです。

1) Javascript で現在時刻を取得する

ISO 8601 日付形式を利用して、ブラウザー側で日付をタイムスタンプ情報を含む形式に変換できます。ここから引用:

「T」は文字列にそのまま表示され、時間要素の開始を示していることに注意してください。時刻は UTC (協定世界時) で表され、特別な UTC 指定子 (「Z」) が付けられます。ATOM RSS フィードで使用されます。

   1: function fnISO() {
   2:     // Only works in Firefox using ECMAScript 5
   3:     var now = new Date().toISOString();
   4:     alert(now);
   5: }

結果:2009-08-06T23:36:31.390Z

2) PHP から MYSQL への ISO 8601 日付の挿入

ISO 8601 日付 (文字列として) は、 strtotime()関数を使用して PHP 日付オブジェクトに変換できます。

strtotime($_POST['event_time_as_ISO8601']);

スクリプトの冒頭で、PHP のデフォルトのタイムゾーンと、MySQL のタイムゾーン (接続用) の両方を次のように設定します。

  • PHP コマンド:date_default_timezone_set('UTC');
  • SQL コマンド:$this->MySQLi->query("SET timezone = 'UTC'");

3) クライアントへの提供

正しく表示するには、日付をブラウザのタイムゾーンに変換する必要があります。

ここでも、PHP と SQL 接続の両方のタイムゾーンを同期する必要があります。日付に続いて、 PHP 日付関数を使用して、JSON ドキュメントに ISO 8601 形式で出力できます。

 date("c", $raw['start_date'])); 

4) ISO 8601 日付をユーザーのタイムゾーンに変換する (ブラウザー):

必要なのは、ISO 8601 日付を解析して Date オブジェクトを作成することだけです。ISO 8601 にはタイムゾーン (UTC の場合は Z) が含まれているため、正しい日時が表示されます。

Help parsing ISO 8601 date in Javascript で説明されているように、1 つの解決策は datejs ライブラリです。

関連項目:

于 2013-06-21T13:35:10.667 に答える
2

1 つの問題:

特定の時間セグメントでイベントを抽出するための一般的な条件は次のとおりです。

 (unix_timestamp(start_date) >= '$start' OR unix_timestamp(end_date) <= '$end')

むしろ :

 (unix_timestamp(start_date) <= '$end' AND unix_timestamp(end_date) >= '$start')

$start 条件 (最初の条件) は、後に開始および終了するイベントのみを除外する$endため、基本的に、データベースに保存されているイベントのリスト全体を fullcalendar に送り返します。

于 2013-06-26T09:03:07.753 に答える