【问题标题】:Fullcalendar events render from DB without regard to timezoneFullcalendar 事件从 DB 呈现,而不考虑时区
【发布时间】:2019-03-30 01:29:17
【问题描述】:

我目前有一个使用 PHP 和 MYSQL (AWS RDS) 设置的全日历应用程序。

事件开始和结束时间以类似于Fri Mar 29 2019 09:00:00 GMT-0700 (Pacific Daylight Time) 的字符串形式存储在数据库中,这些字符串来自event.startevent.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' 更改时区时,没有任何反应。

任何帮助/建议将不胜感激,谢谢!

【问题讨论】:

  • start_eventend_event 列是什么数据类型?
  • @Nick Strings - 这不是最佳的,但我不确定如何正确解析它们
  • @Nick 这可能是问题的根源。我将研究在字符串进入数据库之前将其转换为日期的方法。
  • 您可能想查看DateTime 类。您也可以使用它来转换输出数据。 Fri Mar 29 2019 09:00:00 GMT-0700 (Pacific Daylight Time) 是您的字符串的确切格式吗?
  • @Nick 这就是格式。我只是查看了该类并尝试使用它,尽管我对 PHP 有点陌生,老实说不知道如何使用。

标签: php mysql fullcalendar fullcalendar-scheduler fullcalendar-4


【解决方案1】:

如果您的日期字符串采用您在问题中描述的格式,例如

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

您应该能够使用 date_create_from_format 将它们解析为 DateTime 对象,例如

$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

Demo on 3v4l.org

【讨论】:

  • 我试过实现这个;但是,当我将它上传到 AWS 并使用它时,我收到一个错误 PHP Fatal error: Uncaught Error: Call to a member function format() on boolean,我无法理解。代码可以看这里:3v4l.org/kUDsJ
  • @Rescis 你能添加if ($start === false) echo DateTime::getLastErrors();$end 也一样),看看它说了什么?另外,如果您可以回显失败的日期字符串,那将很有帮助。
  • 现在 insert.php 正在通过 jquery ajax 调用 - 如果这样设置,您是否知道 echo 的等效项?
  • @Rescis 如果您要返回任何数据,您可以将所有代码包装在 ob_start() 中,然后将 'output' =&gt; ob_get_clean() 之类的内容添加到返回数据中,然后在 jQuery 中发出警报。跨度>
  • 我把它修好了。问题是end 是空的,然后date_create_from_format 抛出一个错误(以一种奇怪的方式)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
相关资源
最近更新 更多