jquery完整日历显示第二天的事件

Ton*_*bet 9 javascript php jquery date jquery-plugins

我正在尝试将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);
Run Code Online (Sandbox Code Playgroud)

这就是我将它们展示到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) {

                                }

                    });
Run Code Online (Sandbox Code Playgroud)

这里的问题是unix_timestamp(start_date)会在日历中生成第二天

(例如:如果在该月的第17天存储start_date,则日历将在第18天出现)

而且我不确定我错过了什么.所有这些都是按照他们的规格制作的......

知道我失败的地方吗?(jquery,mysql或时区设置?)

-编辑-

我有点修理它

$row['start'] = $row['start'] - 60*60*24 /* One day */;
Run Code Online (Sandbox Code Playgroud)

所以,现在start_datestart意义在一起(日历...)

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

Men*_*los 7

根据MySQL 5.6参考手册p - 12.7 日期和时间函数一章

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. 我们是否需要检测时区和浏览器的位置,因为两个不同的查看者可能会上传相同的日期时间(但没有时区组件).

资源

有必要检查哪个时区浏览器位于其中,并对其进行补偿,以及补偿浏览器查看事件.

以下是处理与Browsers/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: }
Run Code Online (Sandbox Code Playgroud)

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

2)从PHP插入ISO 8601日期到MYSQL

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

strtotime($_POST['event_time_as_ISO8601']);
Run Code Online (Sandbox Code Playgroud)

在脚本的开头,我将使用以下内容设置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'])); 
Run Code Online (Sandbox Code Playgroud)

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

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

一个解决方案是datejs库,如帮助解析Javascript中的ISO 8601日期中所述.

也可以看看: