完整日历时区时刻js问题

时间:2015-06-13 16:42:03

标签: javascript timezone fullcalendar momentjs

我现在已经和它搏斗了一段时间,所以请伸出援助之手。

我有一个使用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();

});  

1 个答案:

答案 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来实现相同的功能。