События полного календаря отображаются из БД без учета часового пояса.

В настоящее время у меня есть приложение fullcalendar, которое я настроил с помощью PHP и MYSQL (AWS RDS).

Время начала и окончания события хранится в базе данных в виде строк вида Fri Mar 29 2019 09:00:00 GMT-0700 (Pacific Daylight Time), которые берутся из свойств event.start и event.end.

Затем они загружаются с помощью load.php (вызывается events: load.php), который выглядит так:

<?php
include 'dbconfig.php';

$conn = $dbConnection;
$query = "SELECT * FROM Events ORDER BY id";

$statement = $conn->prepare($query);
$statement->execute();

$data = $statement->fetchAll();
$results = array();

foreach($data as $row) {
    $results[] = array(
        'id'   => $row["id"],
        'title'   => $row["title"],
        'resourceId' => $row["resource"],
        'start'   => $row["start_event"],
        'end'   => $row["end_event"]
    );
}

echo json_encode($results);

В этот момент они отображают; однако они всегда отображаются на 7 часов раньше, чем должны (например, 09:00:00 превращается в 16:00:00).

Я предполагаю, что это связано с тем, что когда данные поступают из базы данных, часовой пояс каким-то образом игнорируется, но когда я меняю часовой пояс с помощью timezone: 'UTC', ничего не происходит.

Любая помощь/предложения будут оценены, и спасибо!


person Rescis    schedule 30.03.2019    source источник
comment
Какой тип данных имеют столбцы start_event и end_event?   -  person Nick    schedule 30.03.2019
comment
@Nick Strings - это не оптимально, но я не был уверен, как правильно их анализировать.   -  person Rescis    schedule 30.03.2019
comment
@Nick Вероятно, это корень проблемы. Я собираюсь изучить способы преобразования строк в даты, прежде чем они попадут в БД.   -  person Rescis    schedule 30.03.2019
comment
Возможно, вы захотите изучить класс DateTime. Вы также можете использовать это для преобразования данных на выходе. Является ли Fri Mar 29 2019 09:00:00 GMT-0700 (Pacific Daylight Time) точным форматом ваших строк?   -  person Nick    schedule 30.03.2019
comment
@Ник Это формат. Я только что посмотрел на класс и попытался его использовать, хотя я немного новичок в PHP и, честно говоря, понятия не имею, как это сделать.   -  person Rescis    schedule 30.03.2019


Ответы (1)


Если ваши строки даты имеют формат, который вы описываете в своем вопросе, например.

Fri Mar 29 2019 09:00:00 GMT-0700 (Pacific Daylight Time)

Вы должны иметь возможность разобрать их на DateTime объекты, используя date_create_from_format, например.

$date_string = 'Fri Mar 29 2019 09:00:00 GMT-0700 (Pacific Daylight Time)';
$date = date_create_from_format('D M d Y H:i:s \G\M\TO+', $date_string);

echo $date->format('Y-m-d H:i:s');

Выход:

2019-03-29 09:00:00

Демо на 3v4l.org

person Nick    schedule 30.03.2019
comment
Я пытался реализовать это; однако, когда я загружаю его в AWS и использую, я получаю сообщение об ошибке PHP Fatal error: Uncaught Error: Call to a member function format() on boolean, которое мне трудно понять. Код можно увидеть здесь: 3v4l.org/kUDsJ - person Rescis; 30.03.2019
comment
@Rescis, можешь добавить if ($start === false) echo DateTime::getLastErrors(); (и то же самое для $end) и посмотреть, что там написано? Также, если вы можете повторить ошибочную строку даты, это было бы полезно. - person Nick; 30.03.2019
comment
Прямо сейчас insert.php вызывается через jquery ajax - знаете ли вы эквивалент для эха, если он настроен как таковой? - person Rescis; 30.03.2019
comment
@Rescis, если вы возвращаете какие-либо данные, вы можете обернуть весь свой код в ob_start(), а затем добавить что-то вроде 'output' => ob_get_clean() к возвращаемым данным, а затем предупредить об этом в jQuery. - person Nick; 30.03.2019
comment
Я исправил это. Проблема заключалась в том, что end был пуст, а затем date_create_from_format выдавал ошибку (каким-то странным образом). - person Rescis; 01.04.2019