2013-04-02 4 views
1

Я пытаюсь вычесть две даты, используя php. Dateone хранится в базе данных, а datetwo - текущая дата. Теперь у меня есть этот странный сценарий: Dateone является 23-03-13 Дата два является 02-04-13Php вычесть две даты с разными датами возвращает неправильный результат

Используя различные методы вычитания, дают различные результаты.

Метод один - возвращает -21

$sqldate ="SELECT exam_date FROM exam_table"; 
$fetchdate = mysql_query($sqldate); 
$rowdate = mysql_fetch_array($fetchdate); 
//Fetch the date stored in the database 
$dateone = $rowdate['exam_date']; 
//Calculate the current date today 
$datetwo =date('d-m-y'); 
//Calculate the diff between the two dates 
$datediff = $datetwo-$dateone; 

В этом случае $ DATEDIFF возвращает -21

Второй метод - Возвращает -7639

$sqldate ="SELECT exam_date FROM exam_table"; 
$fetchdate = mysql_query($sqldate); 
$rowdate = mysql_fetch_array($fetchdate); 
//Fetch the date stored in the database 
$dateone = $rowdate['exam_date']; 
//Calculate the current date 
$datetwo =date('d-m-y'); 
//Calculate the diff between the two dates 
$datetime1 = strtotime("$dateone"); 
$datetime2 = strtotime("$datetwo"); 
//seconds between the two times 
$secs = $datetime2 - $datetime1; 
$days = $secs/86400; 

В этом случае , возврат в долларах США -7639

+0

Я предполагаю, что одна из дат больше, чем другая. Распечатайте их во время выполнения и посмотрите. – MahanGM

+0

Во втором вы используете $ datetoday, но конвертируете во время, используя $ datetwo. Также выпишите результат $ dateone, затем $ datetwo во время выполнения, чтобы мы могли увидеть результат. – karmafunk

+0

где '$ datetwo' в ** метод два ** ?? – egig

ответ

0

Да, проблема заключается в том, что формат даты не является стандартным для получения разницы. Вы должны сообщить свой текущий формат на сегодняшний день &, чтобы преобразовать его в стандартный, чтобы получить правильную разницу.

$datetime1 = DateTime::createFromFormat('d-m-Y', '23-03-13'); #In you case it is considering 13-03-2023 
$datetime1->format('d-m-YY'); 
$datetime2 = DateTime::createFromFormat('d-m-Y', '02-04-13'); #In you case it is considering 13-04-2002 
$datetime2->format('d-m-YY'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%R%a days'); #output +10 days 

CodeViper Demo.

Примечание: PHP версия должна быть> = 5.3.0.

+0

Это хорошо работает, что, если я хочу сохранить разницу в переменной? – mutiemule

+0

@Joseph - Вместо этого эхо присваивается переменной. – Rikesh

+0

пожалуйста demo это. – mutiemule

0

Почему бы не сделать все это в SQL?

"SELECT time_to_sec(datediff(`exam_date`, curdate())) as datedifference FROM exam_table"; 

и это только в PHP:

fetch_assoc { $datediff = $row['datedifference']; 
0

попробовать этот

echo $dateone = '02-04-13'; 
echo $datetwo = '06-04-13'; 
echo $datediff = $datetwo-$dateone; 
+0

Это работает очень хорошо, но проблема в том, когда меняется месяц.В вашем сценарии, если dateone - 02-04-13, а datetwo - 06-05-13, результат будет совсем другим. – mutiemule

0

SQL-запрос будет идеальным для этого

SELECT DATEDIFF(exam_date,CURDATE()) AS DiffDate FROM exam_table 

PHP

$dateone = $rowdate['DiffDate']; 
+0

Это работает, но он дает результат как 3632. В чем проблема? – mutiemule

+0

Как вы хотите, чтобы разница была? в часах или секундах? Поэтому я могу настроить код. –

+0

В дни, пожалуйста. – mutiemule

0

Почему бы не использовать DateTime::diff? Источник: http://php.net/manual/en/datetime.diff.php

$datediff = $datetwo->diff($dateone); 
echo $datediff; 

Эта разница будет в эпоху. Вам нужно будет преобразовать его в желаемый формат.

Смежные вопросы