[英]Fullcalendar and timezones. Help, I'm doing it wrong
I'm doing it wrong somehow. 我不知何故做错了。 I'm getting tripped up on timezones with Fullcalendar
. 我正在使用Fullcalendar
绊倒时区。 I've tried setting ignoreTimezone
to true and false, but it doesn't seem to matter. 我已经尝试将ignoreTimezone
设置为true和false,但似乎并不重要。 It's in the code below in two places because I wasn't sure from the doc where it goes. 这是在下面的代码中的两个地方,因为我不确定它来自哪个文档。
My data source is a hidden form field. 我的数据源是隐藏的表单字段。 Data that goes out of FullCalendar
is adjusted by adding 5 hours (CDT). 超出 FullCalendar
数据通过添加5小时(CDT)进行调整。 Data that goes in to FullCalendar
isn't adjusted by removing 5 hours. 数据进入到 FullCalendar
不是除去5小时调整。
On the back-end, I'm just saving and returning the JSON string without processing it (or even decoding it) 在后端,我只是保存并返回JSON字符串而不处理它(甚至解码它)
Page Load:
Data In: Empty, no data
Data Edit: drag from noon to 2pm (CDT), then submit form
Data Out: Use clientEvent to get data, and JSON.stringify to put into form field.
[{"id":6844,"title":"Open","start":"2011-04-19T17:00:00.000Z","end":"2011-04-19T19:00:00.000Z","allDay":false}]
Page Load (after submitting form):
Data In: Use JSON.parse to load data from hidden form field. This is the incoming data, but the event is shifted to 5pm (CDT) in the control.
[{"id":6844,"title":"Open","start":"2011-04-19T17:00:00.000Z","end":"2011-04-19T19:00:00.000Z","allDay":false}]
Data Out: Without changing the control, it's now:
[{"id":6844,"title":"Open","start":"2011-04-19T22:00:00.000Z","end":"2011-04-20T00:00:00.000Z","allDay":false}]
I setup the Fullcalendar
like this: 我像这样设置Fullcalendar
:
// Fullcalendar for business hours page
jQuery(document).ready(function() {
jQuery('#edit-submit').bind("click", business_hours_set);
jQuery('#edit-preview').bind("click", business_hours_set);
jQuery('#calendar').fullCalendar({
// configure display
header: {
left: '',
center: '',
right: ''
},
ignoreTimezone: false,
defaultView: 'agendaWeek',
allDaySlot: false,
firstHour: 8,
// configure selection for event creation
selectable: true,
selectHelper: true,
select: business_hours_add,
// configure data source
editable: true,
eventSources: [
{
events: jQuery.parseJSON(jQuery('#fullcalendar_data').val()),
color: '#992B0A',
textColor: 'white',
ignoreTimezone: false
}
],
// configure editing
eventClick: function(calEvent) {
business_hours_delete(calEvent.id);
}
});
alert(jQuery('#fullcalendar_data').val());
});
function business_hours_add(startDate, endDate) {
var calendar = jQuery('#calendar');
var newid = Math.ceil(Math.random()*64000);
calendar.fullCalendar('renderEvent',
{
id: newid,
title: "Open",
start: startDate,
end: endDate,
allDay: false
},
true // make the event "stick"
);
calendar.fullCalendar('unselect');
}
var business_hours_selectedId = -1;
function business_hours_delete(id) {
business_hours_selectedId = id;
jQuery( "#dialog-confirm" ).dialog({
resizable: false,
height:160,
modal: true,
buttons: {
"Yes, delete!": function() {
calendar = jQuery('#calendar');
calendar.fullCalendar( 'removeEvents', business_hours_selectedId);
jQuery( this ).dialog( "close" );
},
Cancel: function() {
jQuery( this ).dialog( "close" );
}
}
}, id);
}
function business_hours_set() {
var data = jQuery('#calendar').fullCalendar( 'clientEvents' );
// data is cyclical. Create a new data structure to stringify.
var ret = [];
for(var i=0; i<data.length; i++) {
var datum = {
id: data[i].id,
title: data[i].title,
start: data[i].start,
end: data[i].end,
allDay: data[i].allDay
}
ret[i] = datum;
}
// stringify and return
jQuery('#fullcalendar_data').val(JSON.stringify(ret));
alert(JSON.stringify(ret));
}
What am I doing wrong? 我究竟做错了什么?
Thanks in advance, Mike 先谢谢你,迈克
I had the same timeshift in FullCalendar. 我在FullCalendar中有相同的时间转换。 Check out your timezone on server, when I changed it to my own it help me. 在服务器上查看你的时区,当我把它更改为我自己的时候它帮助我。 You may try to do it in few ways: 您可以尝试以几种方式执行此操作:
On serer: 在serer上:
[root@mx ~]# mv /etc/localtime /etc/localtime.old [root @mx~] #mv / etc / localtime /etc/localtime.old
[root@mx ~]# ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime [root @mx~] #ln -s / usr / share / zoneinfo / Europe / Moscow / etc / localtime
Or in PHP script (which returns JSON string): 或者在PHP脚本中(返回JSON字符串):
date_default_timezone_set('Europe/Moscow'); date_default_timezone_set( '欧洲/莫斯科');
PS Don't forget to change "Europe/Moscow" to your values :-) PS别忘了将“欧洲/莫斯科”改为你的价值观:-)
Then you have to set your valid time in new time zone ("date" command); 然后你必须在新的时区设置你的有效时间(“日期”命令);
You are serializing CDT-adjusted dates as UTC dates (thus getting a 5 hour shift) so when they are read back in they get re-adjusted to CDT, and so on.. 您正在将CDT调整的日期序列化为UTC日期(因此获得5小时的班次),因此当他们被回读时,他们会重新调整为CDT,依此类推。
Because there isn't a way to set a timezone on JS date objects, Fullcalendar represents them internally as UTC dates, but adjusts for timezone offset on input time. 因为没有办法在JS日期对象上设置时区,所以Fullcalendar在内部将它们表示为UTC日期,但会根据输入时间调整时区偏移量。
$.fullCalendar.parseISO8601('2011-04-19T17:00:00.000-05:00');
// Tue Apr 19 2011 22:00:00 GMT+0000 (GMT) <-- note time shift
This is why, when you serialize to JSON, you get a string with the "Zulu" (UTC) timezone: 这就是为什么当你序列化为JSON时,你得到一个带有“Zulu”(UTC)时区的字符串:
var dt = $.fullCalendar.parseISO8601('2011-04-19T17:00:00.000-05:00');
JSON.stringify( dt ); // "2011-04-19T22:00:00.000Z"
You need the date back to your timezone. 您需要将日期返回到您的时区。 It doesn't look like Fullcalendar has this so you'll need to to the work: 它看起来不像Fullcalendar,所以你需要做的工作:
// detect local timezone offset
var localoffset = (new Date()).getTimezoneOffset();
// "unadjust" date
ret = new Date( ret.valueOf() + (localoffset * 60 * 1000) );
// serialize
function pad (n) { return String(n).replace(/^(-?)(\d)$/,'$10$2'); }
JSON.stringify( ret )
// replace Z timezone with current
.replace('Z', pad(Math.floor(localoffset / 60))+':'+ pad(localoffset % 60));
// should result in something like: "2011-04-21T19:00:00.000-05:00"
There may be a better way of solving this using Fullcalendar but I am not familiar with it. 使用Fullcalendar可能有更好的解决方法,但我不熟悉它。
Code is untested: I live in GMT with no-DST and don't really want to mess with my system just to see it work (YMMW). 代码是未经测试的:我住在没有DST的GMT,并且真的不想弄乱我的系统只是为了看它工作(YMMW)。 :-) :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.