Javascript Office365的完整日历日期偏移量
我正在将Office365中的事件导入FullCalendar以在网站上显示,但显示的时间与Office365上事件设置的时间相差1小时(即设置为14:00:00的事件显示为13:00:00),我被卡住了,无法理解为什么会发生这种情况 为日历创建事件的函数:Javascript Office365的完整日历日期偏移量,javascript,php,fullcalendar,office365,outlook-restapi,Javascript,Php,Fullcalendar,Office365,Outlook Restapi,我正在将Office365中的事件导入FullCalendar以在网站上显示,但显示的时间与Office365上事件设置的时间相差1小时(即设置为14:00:00的事件显示为13:00:00),我被卡住了,无法理解为什么会发生这种情况 为日历创建事件的函数: function getTentativeEvents(){ client .api("/me/calendars/"+calID1+"/calendarview/?$top=3000&$filt
function getTentativeEvents(){
client
.api("/me/calendars/"+calID1+"/calendarview/?$top=3000&$filter=ShowAs eq 'Tentative'&startDateTime="+calStartDate+"&endDateTime="+calEndDate)
.select("Subject,Start,Id,End,Categories")
.get((err, res) => {
if (err) {
console.log(err);
return;
}
console.log(res);
var catNameFound = "";
var categoryTitleTotal = timeSlotsCategoryTitleArray.length;
var arrayLength = res['value'].length;
var counter = arrayLength -1;
for (var i = 0; i < arrayLength; i++) {
var eveColour = defaultTimeSlotBackgroundColour;
var eveTxtColour = defaultTimeSlotTextColour;
var categoriesLength = res['value'][i]['categories'].length;
if(categoriesLength >= 1){
for (var i2 = 0; i2 < categoriesLength; i2++) {
var catNameFound = res['value'][i]['categories'][i2];
catNameFound = catNameFound.toLowerCase();
for (var i3 = 0; i3 < categoryTitleTotal; i3++) {
var timeSlotToCheck = timeSlotsCategoryTitleArray[i3];
timeSlotToCheck = timeSlotToCheck.toLowerCase();
//console.log(catNameFound);
if(timeSlotToCheck == catNameFound){
eveColour = timeSlotsBackgroundColourArray[i3];
eveTxtColour = timeSlotsTextColourArray[i3];
}
}
}
}
eventSubject = res['value'][i]['subject'];
eventID = res['value'][i]['id'];
startDate = res['value'][i]['start']['dateTime'];
endDate = res['value'][i]['end']['dateTime'];
startDate = startDate.replace(".0000000", "");
endDate = endDate.replace(".0000000", "");
addToEventList(eventSubject,startDate,endDate,eventID,eveColour,eveTxtColour);
}
//
$('#calendar1').fullCalendar('gotoDate', '<?php echo $theDateAfter; ?>');
$("#calendar1").fullCalendar('addEventSource', timeSlotsArray);
$('#calendarLoader').hide();
$('#calendar1').show();
});
header: {
left: 'prev,next today',
center: 'title',
right: ''
},
defaultView: 'agendaDay',
defaultDate: '<?php echo $theDateAfter; ?>',
eventColor: defaultTimeSlotBackgroundColour,
minTime: "10:00:00",
timezone: "Europe/London",
ignoreTimezone: false,
maxTime: "20:00:00",
editable: false
函数gettentiveEvents(){
客户
.api(“/me/calendars/”+calID1+“/calendarview/?$top=3000&$filter=ShowAs eq‘暂定’&startDateTime=“+calStartDate+”&endDateTime=“+calEndDate”)
.选择(“主题、开始、Id、结束、类别”)
.get((err,res)=>{
如果(错误){
控制台日志(err);
返回;
}
控制台日志(res);
var catNameFound=“”;
var categoryTitleTotal=TimeSlotScategoryTitleAry.length;
var arrayLength=res['value'].长度;
var计数器=阵列长度-1;
对于(变量i=0;i function getTentativeEvents(){
client
.api("/me/calendars/"+calID1+"/calendarview/?$top=3000&$filter=ShowAs eq 'Tentative'&startDateTime="+calStartDate+"&endDateTime="+calEndDate)
.select("Subject,Start,Id,End,Categories")
.get((err, res) => {
if (err) {
console.log(err);
return;
}
console.log(res);
var catNameFound = "";
var categoryTitleTotal = timeSlotsCategoryTitleArray.length;
var arrayLength = res['value'].length;
var counter = arrayLength -1;
for (var i = 0; i < arrayLength; i++) {
var eveColour = defaultTimeSlotBackgroundColour;
var eveTxtColour = defaultTimeSlotTextColour;
var categoriesLength = res['value'][i]['categories'].length;
if(categoriesLength >= 1){
for (var i2 = 0; i2 < categoriesLength; i2++) {
var catNameFound = res['value'][i]['categories'][i2];
catNameFound = catNameFound.toLowerCase();
for (var i3 = 0; i3 < categoryTitleTotal; i3++) {
var timeSlotToCheck = timeSlotsCategoryTitleArray[i3];
timeSlotToCheck = timeSlotToCheck.toLowerCase();
//console.log(catNameFound);
if(timeSlotToCheck == catNameFound){
eveColour = timeSlotsBackgroundColourArray[i3];
eveTxtColour = timeSlotsTextColourArray[i3];
}
}
}
}
eventSubject = res['value'][i]['subject'];
eventID = res['value'][i]['id'];
startDate = res['value'][i]['start']['dateTime'];
endDate = res['value'][i]['end']['dateTime'];
startDate = startDate.replace(".0000000", "");
endDate = endDate.replace(".0000000", "");
addToEventList(eventSubject,startDate,endDate,eventID,eveColour,eveTxtColour);
}
//
$('#calendar1').fullCalendar('gotoDate', '<?php echo $theDateAfter; ?>');
$("#calendar1").fullCalendar('addEventSource', timeSlotsArray);
$('#calendarLoader').hide();
$('#calendar1').show();
});
header: {
left: 'prev,next today',
center: 'title',
right: ''
},
defaultView: 'agendaDay',
defaultDate: '<?php echo $theDateAfter; ?>',
eventColor: defaultTimeSlotBackgroundColour,
minTime: "10:00:00",
timezone: "Europe/London",
ignoreTimezone: false,
maxTime: "20:00:00",
editable: false
标题:{
左:“上一个,下一个今天”,
中心:'标题',
对:“”
},
defaultView:'agendaDay',
默认日期:“”,
eventColor:DefaultTimeSlotBackgroundColor,
minTime:“10:00:00”,
时区:“欧洲/伦敦”,
ignoreTimezone:错误,
maxTime:“20:00:00”,
可编辑:false
我检查了Office365上的设置,并将其正确设置为UTC+0(伦敦)
我遗漏了什么?这是因为时间是以UTC返回的。您需要将它们转换为本地时间。有一个非常好的库,名为。您可以使用该库使用以下代码:
var localTime = moment.utc(startDate).toDate();
localTime = moment(localTime).format('YYYY-MM-DD HH:mm:ss');
实际导入数据中的开始/结束时间是什么样子的?它们有指定的时区吗?它们是这样的:2017-05-26T12:00:00.0000000,正如您在代码上看到的,我正在修剪额外的零。这可能与英国现在是夏季,所以时钟比UTC早一小时有关。Office365可能显示tBST时间?检查导出的数据与Office屏幕上实际显示的数据,并且这些日期没有指定任何时区,这可能会使事情变得混乱。是的,可能是这样,但考虑到Office365和FullCalendar都设置为正确的时区,这是没有意义的,除非Office365 API忽略了时间在UTC中分区和导出?通过深入研究,我发现我可以在从office365请求事件时使用“preference:outlook.timezone=“Europe/London”指定时区,但这是一个HTTP头请求,我不知道如何在javascript中实现。您似乎在使用我不熟悉的库来发出api请求,但一般来说,为ajax请求设置HTTP头是肯定可行的。也许可以查看库中的文档,了解如何执行此操作。这里说明如果您指定了通知fullcalendar时区,然后“您的服务器端脚本将使用timezone参数计算返回的ISO8601日期的时区偏移量!”