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

#php #mysql #fullcalendar #fullcalendar-scheduler #fullcalendar-4

#php #mysql #полный календарь #полный календарь-планировщик #полный календарь-4

Вопрос:

В настоящее время у меня есть приложение полного календаря, которое я настроил с использованием 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' , ничего не происходит.

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

Комментарии:

1. К какому типу данных относятся столбцы start_event и end_event ?

2. @Nick Strings — это не оптимально, но я не был уверен, как их правильно анализировать

3. @Nick Это, вероятно, корень проблемы. Я собираюсь изучить способы преобразования строк в даты, прежде чем они попадут в базу данных.

4. Вы, вероятно, хотите заглянуть в DateTime класс. Возможно, вы сможете использовать это и для преобразования выходных данных. Является Fri Mar 29 2019 09:00:00 GMT-0700 (Pacific Daylight Time) точным форматом ваших строк?

5. @Nick Это формат. Я просто посмотрел на класс и попытался его использовать, хотя я немного новичок в PHP и, честно говоря, понятия не имею, как это сделать.

Ответ №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 GMTO ', $date_string);

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

Вывод:

 2019-03-29 09:00:00
  

Демонстрация на 3v4l.org

Комментарии:

1. Я пытался реализовать это; однако, когда я загружаю его в AWS и использую, я получаю ошибку PHP Fatal error: Uncaught Error: Call to a member function format() on boolean , которую мне трудно понять. Код можно увидеть здесь: 3v4l.org/kUDsJ

2. @Rescis можете ли вы добавить if ($start === false) echo DateTime::getLastErrors(); (и то же самое для $end ) и посмотреть, что там написано? Также, если вы можете повторить строку даты с ошибкой, это было бы полезно.

3. Прямо сейчас insert.php вызывается через jquery ajax — знаете ли вы эквивалент echo, если он настроен как таковой?

4. @Rescis если вы возвращаете какие-либо данные, вы могли бы обернуть весь свой код в ob_start() , а затем добавить что-то вроде 'output' => ob_get_clean() к возвращаемым данным, а затем предупредить об этом в jQuery.

5. Я это исправил. Проблема заключалась в том, что end было пусто, а затем date_create_from_format выдало ошибку, в которой говорилось об этом (в какой-то странной манере).