全日历时区时刻js问题

JGu*_*mer 2 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();

});  
Run Code Online (Sandbox Code Playgroud)

Mat*_*int 5

FullCalendar 的时区文档解释了命名时区预计在服务器上计算。虽然它支持使用时区标记事件,但它不会在客户端进行任何时区转换。除非此行为在未来版本中发生变化,否则它不适合您描述的场景。

然而,这并不意味着你被困住了。FullCalendar 依赖于moment.js ,并且 moment.js 有一个名为moment-timezone的插件。它专门设计用于使用 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"
Run Code Online (Sandbox Code Playgroud)

补充几点:

  • 随着世界各国政府改变其偏移量和夏令时规则的想法,时区数据会定期发生变化。订阅IANA 时区公告邮件列表,了解最新动态。预计任何时区库都会在 IANA 发布后一周左右的时间内提供更新。

  • 由于您使用的是 SignalR,我假设您的后端必须是 .NET。FullCalendar 文档显示使用 PHP 作为后端,它已经支持 IANA 时区。但是,在 .NET 中,您可以使用Noda Time来实现相同的功能。