我现在已经和它搏斗了一段时间,所以请伸出援助之手。
我有一个使用Signal R的实时多时区应用程序,使用UTC存储和广播所有日期时间,我想操纵它们客户端,以避免在更新一个约会时为不同用户进行多次广播。
我试图让fullcalendar在用户的相应时区显示日期,它不是基于浏览器,而是基于用户登录时保留的本地字符串。
这甚至可能吗?或者我是否需要存储偏移并按此方式执行(我希望避免这种情况)。我正在使用eventRender进行操作,但这给了我其他问题并引发了一个错误。
我的代码是:
$(document).ready(function() {
function renderCalendar() {
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
editable: true,
timezone: "Europe/Istanbul",
eventLimit: true, // allow "more" link when too many events
events: [{"id":1026,"taskTypeId":4,"title":"(New Appointment)","start":"2015-06-11T11:00:00Z","end":"2015-06-11T12:00:00Z", "timezone":"UTC","allDay":false,"url":null,"location":"","people":null,"className":"event-appointment"}],
eventRender: function(event, el) {
if (event.start.hasZone()) {
el.find('.fc-title').after(
$('<div class="tzo"/>').text(event.start.format('Z'))
);
}
}
});
}
renderCalendar();
});
答案 0 :(得分:4)
FullCalendar's time zone documentation解释了预期在服务器上计算命名时区。虽然它支持使用时区标记事件,但它不会在客户端进行任何时区转换。除非此行为在将来的版本中发生更改,否则它不适合您描述的方案。
但是,这并不意味着你被困住了。 FullCalendar依赖于moment.js,并且有一个名为moment-timezone的moment.js附加组件。它专门用于使用IANA时区标识符执行客户端时区转换,例如您在示例中显示的"Europe/Istanbul
“。
当您从SignalR广播收到事件时,您可以使用moment-timezone将UTC转换为所需区域,然后再将结果发送到FullCalendar事件对象。
var s = moment("2015-06-11T11:00:00Z").tz("Europe/Istanbul").format();
// result: "2015-06-11T14:00:00+03:00"
还有几点:
随着世界各国政府改变他们对偏移和夏令时规则的看法,时区数据会定期变化。订阅IANA Time Zone Announcements mailing list,随时了解最新动态。在IANA版本的一周左右的时间内,期望来自任何时区库的更新是合理的。
由于您使用的是SignalR,我认为您的后端必须是.NET。 FullCalendar文档显示使用PHP作为后端,它已经支持IANA时区。但是,在.NET中,您可以使用Noda Time来实现相同的功能。