cron中的时区问题

时间:2017-09-05 13:41:45

标签: php mysql yii2

我正在制作拍卖应用程序,人们可以在不同地点的特定日期时间创建他们的拍摄。

我想向匹配的用户发送此次竞价的通知,但它无效。 请看看下面的cron将会每分钟运行一次。

对于exp:我已经创建了一个拍卖,它将在拍卖开始之前开始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
        }
}

3 个答案:

答案 0 :(得分:1)

棘手的问题是尝试管理不同时区的不同流程。为简单起见,强烈建议您以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的DateTimehttp://php.net/manual/en/class.datetime.php

答案 1 :(得分:1)

轻松一步。 在表中保存用户时区。 并使用Yii Formatter Class

在main.config中

'formatter' => [
            'class'=>\common\components\Formatter::className(),
            'defaultTimeZone' => 'UTC',
            'timeZone' => 'UTC',
        ],

在common \ components

中创建Formatter类

in controler

 public function beforeAction($action)
    {$this->setTimeZone();
    }

 public function setTimeZone()
    {
        if (!Yii::$app->user->isGuest) {            
            $timezone = Yii::$app->user->identity->timezone;
            if ($timezone && $timezone != Yii::$app->components['formatter']) {
                $formatter = Yii::$app->components['formatter'];
                $formatter['timeZone'] = $timezone;
                Yii::$app->setComponents(['formatter' => $formatter]);
            }
        }
        return true;
    }

答案 2 :(得分:0)

$ php -i |grep php\.ini

找到CLI版本的php.ini文件并选择您的默认时区。