Javascript 完整日历时区问题

Javascript 完整日历时区问题,javascript,timezone,fullcalendar,momentjs,Javascript,Timezone,Fullcalendar,Momentjs,我已经为此挣扎了一段时间,所以请伸出援手 我有一个使用Signal R的实时多时区应用程序,所有日期时间都使用UTC存储和广播,我希望在客户端对其进行操作,以避免在更新一个约会时对不同用户进行多次广播 我试图让fullcalendar为用户显示适当时区中的日期,它不是基于浏览器,而是用户登录时保存的本地字符串 这可能吗?或者我需要存储偏移量并以这种方式进行(我希望避免这种情况)。我曾使用eventRender进行操作,但这给了我其他问题,并引发了一个bug 我的代码是: $(documen

我已经为此挣扎了一段时间,所以请伸出援手

我有一个使用Signal R的实时多时区应用程序,所有日期时间都使用UTC存储和广播,我希望在客户端对其进行操作,以避免在更新一个约会时对不同用户进行多次广播

我试图让fullcalendar为用户显示适当时区中的日期,它不是基于浏览器,而是用户登录时保存的本地字符串

这可能吗?或者我需要存储偏移量并以这种方式进行(我希望避免这种情况)。我曾使用eventRender进行操作,但这给了我其他问题,并引发了一个bug

我的代码是:

   $(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();

});  
$(文档).ready(函数(){
函数renderCalendar(){
$(“#日历”).fullCalendar({
标题:{
左:“上一个,下一个今天”,
中心:'标题',
右图:“月,agendaWeek,agendaDay”
},
是的,
时区:“欧洲/伊斯坦布尔”,
eventLimit:true,//当事件太多时允许“更多”链接
事件:[{“id”:1026,“taskTypeId”:4,“标题”:(新约会)”,“开始”:“2015-06-11T11:00:00Z”,“结束”:“2015-06-11T12:00:00Z”,“时区”:“UTC”,“全天”:false,“url”:null,“地点”:“人员”:null,“类名”:“事件约会”},
eventRender:函数(事件,el){
if(event.start.hasZone()){
el.find('.fc title')。在(
$('').text(event.start.format('Z'))
);
}
}
});
}
renderCalendar();
});  
解释了需要在服务器上计算指定时区。虽然它支持使用时区标记事件,但它不在客户端进行任何时区转换。除非在将来的版本中更改此行为,否则它不适合您描述的场景

然而,这并不意味着你被困住了。FullCalendar依赖于,并且有一个名为moment.js的插件。它专门设计用于使用IANA时区标识符执行客户端时区转换,例如示例中显示的
“Europe/Istanbul

当您从信号器广播接收到事件时,可以在将结果发送到FullCalendar事件对象之前,使用矩时区从UTC转换到所需的区域

var s=moment(“2015-06-11T11:00:00Z”).tz(“欧洲/伊斯坦布尔”).format();
//结果:“2015-06-11T14:00:00+03:00”
还有几点:

  • 时区数据周期性地变化,因为世界各国政府改变了对其偏移量和夏令时规则的看法。通过订阅网站来了解最新信息。在IANA发布后一周左右的时间内,任何时区库都会进行更新,这是合理的

  • 因为您使用的是signar,所以我假设您的后端必须是.NET。FullCalendar文档显示了使用PHP作为后端,它已经支持IANA时区。但是,在.NET中,您可以使用相同的功能


谢谢Matt,我在第一次尝试使用eventRender解决此问题时使用了矩时区,不幸的是,它以UTC显示时间,直到您更改一次视图为止(我已将此作为Adam Shaw的潜在错误提出)。今天我已经将代码迁移到了野田佳彦,这是最后一次尝试。我想我必须在全日历得到客户端或考虑发送多个广播之前操纵日期。这个答案给了我另一个问题,这个问题是我在做这件事时遇到的。在我实现这一点后,我将分别提出。