我正在尝试将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)
会在日历中生成第二天
(例如:如果在当天的第17天存储start_date,则日历将在第18天出现)
而且我不确定我错过了什么。所有这一切都是按照他们的规范制作的......
知道我失败的地方吗? (jquery,mysql或时区设置?)
- 编辑 -
我通过
解决了这个问题$row['start'] = $row['start'] - 60*60*24 /* One day */;
所以现在start_date
和start
一起有意义(在日历中......)
请告诉我你知道一个更好的解决方案!
答案 0 :(得分:7)
根据 MySQL 5.6参考手册 - 12.7 Date and Time Functions
章节UNIX_TIMESTAMP()假定其参数是日期时间值 当前时区。
有必要检查哪个时区浏览器位于其中,并对其进行补偿,以及补偿浏览器查看事件。
以下是处理与浏览器/ 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)从PHP插入ISO 8601日期到MYSQL
ISO 8601日期(作为字符串)可以使用strtotime()函数转换为PHP日期对象。
strtotime($_POST['event_time_as_ISO8601']);
在脚本的开头,我将使用以下内容设置PHP默认时区,以及MySQL时区(用于连接):
date_default_timezone_set('UTC');
$this->MySQLi->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中所述。
另见:
答案 1 :(得分:1)
我不明白你为什么在选择查询上使用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
答案 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。
答案 3 :(得分:0)
我会回答LeGEC的答案
WHERE (unix_timestamp(start_date) >= '$start' OR unix_timestamp(end_date) <= '$end')
只需从或中创建 AND 条件,您就不会看到过去的记录..
我相信这会做..