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