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
});
现在我的 startDate
和 endDate
看起来像:
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是最佳选择
我试图将 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
});
现在我的 startDate
和 endDate
看起来像:
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是最佳选择