FullCalendar JS - select 回调以错误的时区传递开始和结束日期

FullCalendar JS - select callback passes start and end dates in wrong timezone

我试图将 selected 事件插入数据库,我注意到我在日历中 select 的时间与传递给 AJAX 的时间不同。 select 回调传递 "start" 和 "end" 时区与日历设置不同的日期。

我的日历设置:

$calendar.fullCalendar({
    header: {
        left: 'prev, today, next',
        center: 'title',
        right: 'agendaWeek, agendaDay'
    },
    timezone: 'Australia/Sydney',
    defaultView: 'agendaWeek',
    selectable: true,
    selectHelper: true,
    select: function(start, end) {
        var startDate = new Date(start);
        var endDate = new Date(end);
        console.log(startDate);
        console.log(startDate);

        // ajax to insert event to DB

    },
    // other configurations
});

现在我的 startDateendDate 看起来像:

Mon Nov 14 2016 08:00:00 GMT+0100

日历设置为 Australia/Sydney,因此我在数据库中保存了错误的开始和结束日期。我有点觉得这是 new Date() 的问题,它生成具有默认时区的给定时间戳,而不是日历设置的时间戳。

有人知道解决办法吗?

开始日期和结束日期是 moment 个对象。但是它们不再处于当前时区,因此您必须克隆对象,应用时区并添加偏移量差异。

select: function(start, end) {
    var startClone = start.clone();
    startClone.tz('Australia/Sydney');
    startClone.add(start.utcOffset() - startClone.utcOffset(), 'minutes');
    console.log(startDate.format());
}

问题在于使用 new Date()

new Date(),默认情况下,在应用程序 运行 所在的浏览器时区上运行,而不考虑您在应用程序中 运行 所在的时区或用户拥有的时区在配置文件中设置(如果适用于您的情况)。

对于多时区应用,moment and moment-timezone是最佳选择