2017-09-05 51 views
0

我正在創建拍賣應用程序,用戶可以在指定的日期時間從不同位置創建自己的autions。cron中的時區問題

我想通知匹配的用戶這次拍賣,但它不工作。 請看看下面的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 
     } 
} 
+1

無論用戶看到什麼,都應該是GUI的功能。在內部,您需要以一致的方式存儲您的時間(例如UTC或您的服務器的時區),否則您最終會遇到類似問題的世界。只需在前端將它們轉換爲用戶首選的時區即可。同樣,來自用戶的任何輸入,在存儲之前轉換爲內部時區。然後在你的數據庫和這個例子中的任何後端操作中,時間都是彼此一致的。 – ADyson

回答

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的DateTime這裏:http://php.net/manual/en/class.datetime.php

1

簡單的步驟。 保存用戶表中的時區。 並使用Yii的格式化類

在main.config

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

創建在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; 
    } 
+0

我越來越etting未知的屬性:common \ components \ Formatter :: defaultTimeZone – Arunendra

0
$ php -i |grep php\.ini 
共同\部件

格式化類

找到CLI版本的php.ini文件並選擇您的默認時區。