我正在尝试将 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 天,则在日历中将出现在第 18 天)
而且我不确定我错过了什么。所有这一切都是我按照他们的规范做的......
知道我哪里失败了吗? (jquery、mysql 或时区设置?)
-编辑-
我修复了它
$row['start'] = $row['start'] - 60*60*24 /* One day */;
所以现在 start_date
和 start
一起有意义(在日历中...)
请告诉我你知道更好的解决方案!
最佳答案
根据章节MySQL 5.6 引用手册p - 12.7 Date and Time Functions
UNIX_TIMESTAMP() assumes that its argument is a datetime value in the current time zone.
关键问题:
- 日期是否通过浏览器插入数据库 - 使用与 PHP 和 MySQL 相同的时区?
- 是否在不考虑时区的情况下插入日期时间,从而导致偏移和错误?
- 在插入和查看以前的事件时是否考虑了浏览器时间?
行动/点数:
- 需要审查您的事件插入代码(javascript 和 PHP)。
- 需要检查您的服务器在哪个时区运行。这可以通过 console command 来完成。 (linux) 或直接在 php 中使用 [date_default_timezone_get()] (http://php.net/manual/en/function.date-default-timezone-get.php)。
- 我们是否需要检测时区和浏览器所在的位置,因为两个不同的查看器可能会上传相同的日期时间(但没有时区组件)。
资源
有必要检查浏览器位于哪个时区,并对此进行补偿,以及对浏览器查看事件进行补偿。
以下是处理上述与浏览器/PHP/MySQL 上的时间戳相关的问题的资源。
- Best way to handle storing/displaying dates in different timezones in PHP?
- http://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/
- PHP & MySQL: Converting Stored TIMESTAMP into User's Local Timezone
- http://isambard.com.au/blog/2009/12/10/managing-timezones-with-php-and-javascript/
解决方案
解决方案是对所有插入使用 UTC 时间戳,并且在查看事件日历时仅使用不同的时间戳进行可视化。
1) 在 Javascript 中获取当前时间
ISO 8601 日期格式可用于将浏览器端的日期转换为包含时间戳信息的格式。引自 here :
Note that the "T" appears literally in the string, to indicate the beginning of the time element. Times are expressed in UTC (Coordinated Universal Time), with a special UTC designator ("Z"). Used in ATOM RSS feeds.
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
ISO 8601 日期(作为字符串)可以使用 strtotime() 转换为 PHP 日期对象功能。
strtotime($_POST['event_time_as_ISO8601']);
在脚本的开头,我会使用以下设置 PHP 默认时区和 MySQL 时区(用于连接):
- PHP 命令:
date_default_timezone_set('UTC');
- SQL Command :
$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 中所述.
另请参阅:
关于php - jquery 全日历显示第二天的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17177550/