DateTime с часовым поясом в php и API Microsoft Graph

Я пытаюсь прочитать записи календаря комнат и вывести следующие три события в их календаре. Однако сначала я тестирую, чтобы увидеть, могу ли я получить только первые 3 события дня, но, похоже, часовой пояс или что-то еще заставляет его неправильно отображать события.

Это функция, которую я написал:

function mb_get_meetings($mb_email = null, $mb_proxy = false, $mb_datetime_start = null, $mb_datetime_finish = null)
{
    date_default_timezone_set('Australia/Melbourne');

    // get the Microsoft Open Graph API
    $mb_msgraph        = json_decode(mb_microsoft_opengraph($mb_proxy), true); // custom function to get Beaker Token + $mb_proxy for internal proxy on or off for dev testing
    $mb_msgraph_token    = $mb_msgraph['access_token'];

    $mb_datetimenow    = new DateTime();
    $mb_datetimezone    = new DateTimeZone('Australia/Melbourne');
    $mb_datetimenow->setTimezone($mb_datetimezone);

    $mb_datetime_start    = new DateTime($mb_datetime_start, $mb_datetimezone);
    $mb_datetime_finish = new DateTime($mb_datetime_finish, $mb_datetimezone);

    $mb_datetime_start    = $mb_datetime_start->format('Y-m-d\TH:i:s.u');
    $mb_datetime_finish = $mb_datetime_finish->format('Y-m-d\TH:i:s.u');

    $mb_url_string = 'https://graph.microsoft.com/v1.0/users/' . $mb_email . '/calendar/calendarView?startDateTime=' . $mb_datetime_start . '&endDateTime=' . $mb_datetime_finish;

    $mb_args = array(
        'headers' => array(
            'Authorization'    => 'Bearer ' . $mb_msgraph_token,
            'Content-Type'    => 'application/x-www-form-urlencoded;charset=UTF-8',
            'Prefer'        => 'outlook.timezone = "Australia/Melbourne"'
        ),
        'httpversion'    => '1.1'
    );
    $mb_output    = wp_remote_get($mb_url_string, $mb_args);
    $mb_output    = wp_remote_retrieve_body($mb_output);
    return $mb_output;
}

Я использую Wordpress в качестве бэкэнда, и он извлекает тело.

На моей странице внешнего интерфейса я вызываю:

$mbroom = (mb_get_meetings('[email protected]', true, 'today 7am', 'today 7pm'));
$mbroom = json_decode($mbroom, true);
$mbroom = $mbroom['value'];


foreach ($mbroom as $k => $v) {

    // get the first 3 entries
    if ($k < 3) {

        print_r($k);
        print_r($v['subject']);
        print_r(date('g:i', strtotime($v['start']['dateTime']));
        print_r(date('g:i', strtotime($v['end']['dateTime']));
        print_r($v['organizer']['emailAddress']['name']);

        echo '<hr>';
    }
}

В результатах я иногда не получаю записей календаря, в то время как в других случаях я могу получить записи на 14:00, но не на 8:00. Я пытался изменить его на жестко закодированные YYYY-MM-DDD 08:00 и YYYY-MM-DD 20:00, но безрезультатно. Я также пробовал yesterday и tomorrow, но ничего/неверные результаты.

Я также пытался зарезервировать целый день с 30-минутными встречами, и это тоже не сработало.

Я делаю что-то неправильно?

Выполните отладку. Как в конечном итоге выглядит этот полностью построенный URL-адрес? Поскольку вы просто объединяете даты, формат, вероятно, не соответствует ожиданиям графического API.

Matt Johnson-Pint 01.05.2019 16:38

Можете ли вы попробовать использовать ->format('c') вместо ->format('Y-m-d\TH:i:s.u'?

Marc LaFleur 01.05.2019 18:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
843
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предлагаю отправлять параметры startDateTime и endDateTime в формате UTC в формате ISO 8601, как описано в документации (https://docs.microsoft.com/en-us/graph/api/user-list-calendarview?view=graph-rest-1.0&tabs=http), что вы и сделали. Однако я бы предложил использовать константу PHP, так как она менее подвержена ошибкам (https://www.php.net/manual/en/class.datetimeinterface.php#datetime.constants.iso8601). Делая что-то вроде следующего для этих параметров:

 $startDateTime = new DateTime(date("Y-m-d H:i:s"));
 $startDateTime = $startDateTime->format(DATE_ISO8601);
 $startDateTime = substr($startDateTime, 0, strpos($startDateTime, '+'));

Редактировать: Использование подстроки для удаления языковой части строки DateTime, вероятно, было наивным, но оно служит цели.

Другие вопросы по теме