Javascript Office365的完整日历日期偏移量

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

我正在将Office365中的事件导入FullCalendar以在网站上显示,但显示的时间与Office365上事件设置的时间相差1小时(即设置为14:00:00的事件显示为13:00:00),我被卡住了,无法理解为什么会发生这种情况

为日历创建事件的函数:

    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=1){ for(var i2=0;i2 以及日历的参数:

    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日期的时区偏移量!”