【问题标题】:jquery full calendar displays events next dayjquery full calendar 显示第二天的事件
【发布时间】:2013-06-15 04:18:33
【问题描述】:

我正在尝试将 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 calendar 展示它们的方式:

$('#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 一起有意义(在日历中...)

请告诉我你知道更好的解决方案!

【问题讨论】:

  • 很好的详细问题,是否有可能一个日历从 0 开始计数,而另一个日历从 1 开始计数? (即:jquery 日历 vs mysql 日历)
  • 所以你是说mysql查询返回了错误的日期?
  • MySQL 是否在不同的主机上? dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html 声明“UNIX_TIMESTAMP() 假定其参数是当前时区中的日期时间值”
  • 我会说您服务器当前时区设置的问题,但我只是在这里推测
  • 您的php 代码中的prettyDateTime 怎么样?它有什么作用?

标签: php javascript jquery date jquery-plugins


【解决方案1】:

根据章节MySQL 5.6 Reference Manualp - 12.7 Date and Time Functions

UNIX_TIMESTAMP() 假设它的参数是一个日期时间值 当前时区。

关键问题:

  • 是否通过浏览器将日期插入数据库 - 使用与 PHP 和 MySQL 相同的时区?
  • 是否在不考虑时区的情况下插入日期时间,导致偏移和错误?
  • 在插入和查看以前的事件时是否考虑了浏览器时间?

行动/要点:

  1. 需要检查您的事件插入代码(javascript 和 PHP)。
  2. 需要检查您的服务器在哪个时区运行。这可以通过console command (linux) 或直接在 php 中使用 [date_default_timezone_get()] 来完成 (http://php.net/manual/en/function.date-default-timezone-get.php)。
  3. 我们是否需要检测时区和浏览器位于哪个时区,因为两个不同的查看者可能会上传相同的日期时间(但没有时区组件)。

资源

需要检查浏览器位于哪个时区,并对此进行补偿,以及对浏览器查看事件进行补偿。

以下是用于处理上述与浏览器/PHP/MySQL 上的时间戳相关的问题的资源。

解决方案

一种解决方案是对所有插入使用 UTC 时间戳,并且在查看事件日历时仅使用不同的时间戳进行可视化。

1) 在 Javascript 中获取当前时间

ISO 8601 日期格式可用于将浏览器端的日期转换为包含时间戳信息的格式。引用here:

请注意,“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) 将 ISO 8601 日期从 PHP 插入 MYSQL

可以使用strtotime() 函数将 ISO 8601 日期(作为字符串)转换为 PHP 日期对象。

strtotime($_POST['event_time_as_ISO8601']);

在脚本的开头,我将使用以下命令设置 PHP 默认时区和 MySQL 时区(用于连接):

  • PHP 命令:date_default_timezone_set('UTC');
  • SQL Command: $this-&gt;MySQLi-&gt;query("SET timezone = 'UTC'");

3) 为客户服务

日期必须转换为浏览器的时区才能正确查看。

PHP 和 SQL 连接时区再次应该同步。可以使用PHP date function 在 JSON 文档中以 ISO 8601 格式打印日期之后。

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

4) 将 ISO 8601 日期转换为用户时区(浏览器):

只需解析 ISO 8601 日期并创建一个日期对象。由于 ISO 8601 包含时区(如果是 UTC,则为 Z),因此将显示正确的日期时间。

一个解决方案是 datejs 库,如 Help parsing ISO 8601 date in Javascript 中所述。

另见:

【讨论】:

    【解决方案2】:

    一个问题:

    在某个时间段提取事件的一般条件不是:

     (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。

    【讨论】:

      【解决方案3】:

      我不明白你为什么在选择查询中使用unix_timestamp(start_date) 然后破坏prettyDateTime($raw['start_date']) 我想说不要在 select 查询中执行 unix_timestamp 在 prettyDateTime 中执行此操作以及在哪里执行此操作

      $start=date('Y-m-d',$start);  $end=date('Y-m-d',$end);
      WHERE (start_date >= '$start' OR end_date <= '$end')
                          AND post_type = 'event'
                          AND lan = '$lan'";
      

      http://www.php.net/manual/en/function.date-default-timezone-set.php

      http://www.php.net/manual/en/function.date-default-timezone-get.php

      【讨论】:

      • 把 2013-02-01 变成时间戳 strtotime($row['start_date']) 增加 1 天开始时间 strtotime($row['start_date']. '+ 1 day') 试试 strtotime 没有 1 天看看它是否有效。
      • 看看它说的时区是否是问题所在 - ignoreTimezone
      【解决方案4】:

      我会接受LeGEC的回答

      WHERE (unix_timestamp(start_date) &gt;= '$start' OR unix_timestamp(end_date) &lt;= '$end')

      只需从 OR 中设置此条件 AND,您将不会看到过去的记录..

      我相信这会做..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-13
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多