【问题标题】:FullCalendar JS - select callback passes start and end dates in wrong timezoneFullCalendar JS - 选择回调在错误的时区传递开始和结束日期
【发布时间】:2016-11-18 16:21:14
【问题描述】:

我试图将选定的事件插入数据库,我注意到我在日历中选择的时间与传递给 AJAX 的时间不同。 select 回调传递的“开始”和“结束”日期与日历设置的时区不同。

我的日历设置:

$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() 的问题,它生成具有默认时区的给定时间戳,而不是日历设置的时间戳。

有人知道解决办法吗?

【问题讨论】:

标签: javascript fullcalendar fullcalendar-scheduler


【解决方案1】:

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

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

【讨论】:

  • 我试过运行这个:moment(start).tz('Australia/Sydney').format() 所以现在如果我从 7:00 到 8:00 选择,不是那个时刻将时区分配给这个小时,而是将 7:00 转换为那个时区18:00。我只需要 7:00 是 Australia/Sydney timezone
  • 我在这里找到了如何转移时间:stackoverflow.com/questions/28593304/… 如果你更新你的答案,我会标记为正确,因为你给了我正确的工作路径。
  • 我已经更新了计算偏移量的答案。很高兴你能弄明白。
【解决方案2】:

问题在于使用new Date()

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    相关资源
    最近更新 更多