2017-01-03 3 views
0

В коде контроллера Php 'date_added' уже существует, и я создал 'date_sla' для текущей даты. В моем аут по отдельности оба работают нормально, но когда я использую для расчета результата разницы, штраф в течение месяца. когда месяц изменяет это показывает отрицательные числа как (3-1-2017) - (31-12-2016) = -28 днейPhp Timestamp с отрицательными значениями при изменении месяца

foreach ($results as $result) { 
    $action = array(); 

    $action[] = array(
       'text' => $this->language->get('text_view'), 
       'href' => $this->url->link('sale/order/info', 'token=' . $this->session->data['token'] . '&order_id=' . $result['order_id'] . $url, 'SSL') 
      ); 

    if (strtotime($result['date_added']) > strtotime('-' . (int)$this->config->get('config_order_edit') . ' day')) { 
     $action[] = array(
        'text' => $this->language->get('text_edit'), 
        'href' => $this->url->link('sale/order/update', 'token=' . $this->session->data['token'] . '&order_id=' . $result['order_id'] . $url, 'SSL') 
       ); 
    } 

    $this->data['orders'][] = array(
       'order_id'  => $result['order_id'], 
       'customer'  => $result['customer'], 
       'status'  => $result['status'], 
       'total'   => $this->currency->format($result['total'], $result['currency_code'], $result['currency_value']), 
       'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])), 
       'date_sla' => date($this->language->get('date_format_short'), time()), 
       'date_modified' => date($this->language->get('date_format_short'), strtotime($result['date_modified'])), 
       'selected'  => isset($this->request->post['selected']) && in_array($result['order_id'], $this->request->post['selected']), 
       'action'  => $action 
      ); 
} 

Html код

<td class="right"><?php echo $order['date_sla'] - $order['date_added']." days";?></td> 
+1

Какая часть из вас думали, что делать вычитание на 2 строки когда-либо будет хорошей идеей. Вы получаете 28 из этого вычитания, потому что '3 - 31' -' -28'. Когда вы выполняете математику по строкам, она преобразует строку в число до тех пор, пока не найдет нечисловое значение (то есть первое пространство или '-') в строке поэтому '3 - 31' – RiggsFolly

+1

Я также предполагаю, что вы сохранили даты как TEXT или VARCHAR в своей базе данных. Начните снова и используйте типы данных DATETIME или TIMESTAMP для дат и времени. Только конвертировать в строку в слое презентации, когда это необходимо – RiggsFolly

+0

Я получил вашу мысль. Возможно, я создал этот $ order ['date_sla'] в неправильном месте. дайте мне некоторое время, я перейду еще раз. И не возражайте, если будут какие-то глупые ошибки, сделанные мной. Я новичок в Php. Спасибо за вашу помощь. –

ответ

4

Первый выводящая ее $order['date_sla'] и $order['date_added'] и посмотрим, что он печатает, если ваша дата имеет формат, как упоминание в вашем предложении (3-1-2017), то попробуйте так:

$d1 = new DateTime('3-1-2017'); 
$d2 = new DateTime('31-12-2016'); 
$difference = $d2->diff($d1); 
echo $difference->format('%r%a days');// 3 days 

ПРИМЕР дЛЯ DATE FORMAT ФРО M IMAGE:

$t=explode("-",'03/01/2017 - 05:23:23 AM');//replace 03/01/2017 - 05:23:23 AM with your variable $order['date_sla'] like $t=explode("-",$order['date_sla']); 
$str=str_replace("/", "-", $t[0]); 
$t1=explode("-",'31/12/2016 - 05:23:23 AM');//replace 03/01/2017 - 05:23:23 AM with your variable $order['date_added' like $t=explode("-",$order['date_added'); 
$str1=str_replace("/", "-",$t1[0]); 

$d1 = new DateTime($str); 
$d2 = new DateTime($str1); 
$difference = $d2->diff($d1); 
echo $difference->format('%r%a days');// 3 days 
+0

Оба показывают хорошие результаты –

+0

@ImmranMohammed, вы должны опубликовать вывод. Я предполагаю, что у вас строка 'numbers' не' date/datetime' в этом случае, если вы вычитаете '3-31', очевидно, чтобы получить' -28'. вам нужно получить полное значение 'date' или' datetime' из 'db' процесса так, как я написал. –

+0

добавил скриншот –