php - cron 中的时区问题

标签 php mysql yii2

我正在创建拍卖应用程序,人们可以在给定的日期时间从不同的位置创建拍卖。

我想向此次拍卖的匹配用户发送通知,但它不起作用。 请查看下面的 cron,它将每分钟运行一次。

例如:我已经创建了一个拍卖,将于 2017-09-06 10:05 开始,所以在拍卖开始之前,我想在 2017-09- 向匹配的用户发送通知06 10:04 但它不起作用。

我检查过,发现我的拍卖时间与服务器时间冲突。有什么办法可以解决吗?

我在我的应用程序中根据用户位置设置了时区

public function actionCron()
    {
        $currentTime = time();
        $currentTimeFuture =$currentTime+90;
        $tableName = \backend\models\Delivery::tableName();

        $sql =  "select id,user_id,auction_start_time from $tableName where status=1 and is_delete=0 and delivery_status=0 and auction_start_time between $currentTime and $currentTimeFuture";

        $data = Yii::$app->getDb()->createCommand($sql)->queryAll();
        foreach($data as $_dilevery){
                // notification code here
        }
}

最佳答案

棘手的问题是尝试管理不同时区的不同进程。为了简单起见,强烈建议您将所有日期/时间存储在 UTC 中,并且您的服务器也以 UTC 运行。这样可以轻松进行日期比较,您永远不必担心夏令时等棘手的事情。

为了使此操作更加用户友好,您应该在用户注册您的应用程序时询问他们所在的时区。您可以存储此时区,然后使用它来简单地格式化应用程序中的所有日期/时间,以使用户更轻松。

以下是获取 UTC 日期/时间并轻松更改不同时区的示例:https://eval.in/855883

  // Store date/time as UTC
  $database_datetime = '2017-09-05 22:00:00';

  // Create a date/time object - TimeZone is UTC
  $dt = new DateTime($database_datetime, new DateTimeZone('UTC'));
  echo $dt->format('Y-m-d H:i:s'); echo "\n\n";

  // Now change to user local date/time based on user timezone
  $dt->setTimezone(new DateTimeZone('America/New_York'));
  echo $dt->format('Y-m-d H:i:s'); echo "\n\n";

  $dt->setTimezone(new DateTimeZone('America/Los_Angeles'));
  echo $dt->format('Y-m-d H:i:s'); echo "\n\n";

在此处了解有关 PHP DateTime 的更多信息:http://php.net/manual/en/class.datetime.php

关于php - cron 中的时区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46056496/

相关文章:

php - 准备语句 PDO 给出 NULL 结果 n DB

php - MySQL:对多列应用随机排序

mysql - 从 SQL 返回 json 对象数组

javascript - Openlayers 3 坐标

php - Yii2 Assets 清除缓存

Yii2 - 子域路由

php - 使用 php 和 jquery 镜像登录

php - 我不明白我的代码中的错误,它是将注册的用户值存储在数据库中,但它显示页面中的错误

php - Composer - 如何将自己的包添加到列表中

MySQL row_format 压缩与动态