Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia pessoal,
Estou tendo um problema com um projeto que estou fazendo, o projeto controla data de inicio e de finalização e eu pego a diferença e coloco em ou outro campo "Total".
Agora quando eu listo todos os registros no final acrescentei um linha de total para conter a soma de todos os campos "Total".
Estou fazendo dessa maneira:
<table id="tabela-cham" class="table table-bordered">
<thead>
<tr>
<th>Tarefa</th>
<th>Solicitante</th>
<th>Hora Inicial</th>
<th>Hora Final</th>
<th>Tempo</th>
<th>Status</th>
</tr>
<tr>
<th><input name="s_cliente" type="text"></th>
<th><input name="s_cliente" type="text"></th>
<th><input name="s_cliente" type="text"></th>
<th><input name="s_cliente" type="text"></th>
<th><input name="s_cliente" type="text"></th>
<th></th>
</tr>
</thead>
<tbody>
<?php
include 'includes/database.php';
$pdo = Database::connect();
$sql = "SELECT * FROM linha_dir";
foreach($pdo->query($sql)as $row){
echo '<tr>';
echo '<td>'.$row['dtini'].'</td>';
echo '<td>'.$row['dtfnl'].'</td>';
echo '<td>'.$row['ttotal'].'</td>';
echo '<td>'.$row['status'].'</td>';
echo '</tr>';
$date = new DateTime('0000-00-00 00:00:00');
$datat = new DateTime($row['ttotal']);
$date->add($datat);
}
Database::disconnect();
echo '<tr>';
echo '<th colspan = 4>Total :</th>';
echo '<td>';
echo $date->format('Y-m-d H:i:s') . "\n";
echo '</td>';
echo '<td></td>';
echo '</tr>';
echo '</tbody>';
echo '</table>';
?>
Tentei fazer desse jeito, porém deu erro
Warning: DateTime::add() expects parameter 1 to be DateInterval, object given in C:\xampp\htdocs\sistemas\forms.php on line 418
e o valor retornado está errado.
Alguém tem alguma dica, ou solução? Valeu!!!
tentei deste modo com date interval
$date = new DateTime('0000-00-00 00:00:00');
$datat = new DateInterval($row['ttotal']);
$date->add($datat);
deu esse erro:
Fatal error: Uncaught exception 'Exception' with message 'DateInterval::__construct(): Unknown or bad format (0000-00-00 00:31:00)' in C:\xampp\htdocs\sistemas\forms.php:417 Stack trace: #0 C:\xampp\htdocs\sistemas\forms.php(417): DateInterval->__construct('0000-00-00 00:3...') #1 {main} thrown in C:\xampp\htdocs\sistemas\forms.php on line 417
Eu fiz algo similar aqui esses dias, veja se te ajuda:
function diferencaHora($horaInicio,$horaFim)
{
$inicio = format_date($horaInicio,"H:i:s");
$fim = format_date($horaFim,"H:i:s");
$inicio = DateTime::createFromFormat('H:i:s', $inicio);
$fim = DateTime::createFromFormat('H:i:s', $fim);
$intervalo = $inicio->diff($fim);
return $intervalo->format('%H:%I');
}
function somaHora($arrayHoras)
{
$segundos = 0;
foreach ( $arrayHoras as $tempo )
{
list( $g, $i, $s ) = explode( ':', $tempo );
$segundos += $g * 3600;
$segundos += $i * 60;
$segundos += $s;
}
$horas = floor( $segundos / 3600 );
$segundos -= $horas * 3600;
$minutos = floor( $segundos / 60 );
$segundos -= $minutos * 60;
if(intval($horas) < 10)
{
$horas = "0".$horas;
}
if(intval($minutos) < 10)
{
$minutos = "0".$minutos;
}
return "{$horas}:{$minutos}";
}
Essas funções você aplica assim:
foreach(blabla)
{
$arrayHora[] = diferencaHora(dataInicio,dataFim);
}
somaHora($arrayHora);Você está passando um valor que não é aceito no DateInterval.
http://php.net/manual/en/class.dateinterval.php
Exemplo de como adicionar um mês
$data->add(new DateInterval("P1M"));
Maykel-ctba eu consegui fazer ajustando suas funções mais ficou com um probleminha ainda nela, meu código ficou deste jeito:
eu não usei sua primeira função apenas a segunda.
function somaHora($arrayHora)
{
$segundos = 0;
foreach ( $arrayHora as $tempo )
{
list( $g, $i, $s ) = explode( ':', $tempo );
$segundos += $g * 3600;
$segundos += $i * 60;
$segundos += $s;
}
$horas = floor( $segundos / 3600 );
$segundos -= $horas * 3600;
$minutos = floor( $segundos / 60 );
$segundos -= $minutos * 60;
if(intval($horas) < 10)
{
$horas = "0".$horas;
}
if(intval($minutos) < 10)
{
$minutos = "0".$minutos;
}
return "{$horas}:{$minutos}";
}
include 'includes/database.php';
$pdo = Database::connect();
$sql = "SELECT * FROM linha_dir";
$i = 0;
foreach($pdo->query($sql)as $row){
$horaTotal = $row['ttotal'];
echo '<tr>';
echo '<td>'.$row['desct'].'</td>';
echo '<td>'.$row['solic'].'</td>';
echo '<td>'.$row['dtini'].'</td>';
echo '<td>'.$row['dtfnl'].'</td>';
echo '<td>'.$row['ttotal'].'</td>';
echo '<td>'.$row['status'].'</td>';
echo '</tr>';
$arrayHora[$i] = $horaTotal;
$i++;
}
Database::disconnect();
echo '<tr>';
echo '<th colspan = 4>Total :</th>';
echo '<td>';
echo somaHora($arrayHora);
echo '</td>';
ele faze a conta certinha no grid, mas quando tem hora cheia ele não converte só os minutos.
exemplo:
Data 1 = 0000-00-00 00:50:00
Data 2 = 0000-00-00 00:20:00
Data 3 = 0000-00-00 01:00:00
o Resultado sai : 01:10
e deveria sair 02:10
outro exemplo é esse :
Data 1 = 0000-00-00 00:38:00
Data 2 = 0000-00-00 00:06:00
Data 3 = 0000-00-00 01:06:00
e ele retorna : 00:50
e era para retornar 01:50
sabe o que pode ser? Valeu !!!!
Editei o post pq o que eu postei não tem nada a ver, hahaha...
cara, não sei te dizer a principio, mas eu não usava com segundos. Veja se com o formato apenas H:i funciona.
O campo que eu uso é datetime, como eu tranformo do formato 0000-00-00 00:00:00 para apenas H:i 00:00 ?
porque se eu criar tipo a sua primeira função mas só transformar o formato da variável ai acho que vai funcionar.
$data1 = new DateTime('2015-01-01');
$data2 = new DateTime('2015-01-03');
$data3 = new DateTime('2015-01-10');
$diff = $data1->diff($data2);
$data3->add($diff);
echo $data3->format('d/m/Y'); // 12/01/2015rockrgo acho que não é isso, pq quando a variável do array ou mesmo ainda no foreach pegar a informação eu mude de datetime para time com apenas hora e minutos, nesse pondo do código eu acredito:
include 'includes/database.php';
$pdo = Database::connect();
$sql = "SELECT * FROM linha_dir";
$i = 0;
foreach($pdo->query($sql)as $row){
$horaTotal = $row['ttotal'];
eu só não estou sabendo fazer a conversão do campo para conseguir fazer a função funcionar dentro do foreach ou no array.
Olá pessoal alguém pode me ajudar como eu coloco este projeto em textfilds ou area no formulário
<?php
date_default_timezone_set('America/Sao_Paulo');
$inicio = '00:00:00';
$fim = new DateTime();
$inicio = DateTime::createFromFormat('H:i:s', $inicio);
$intervalo = $inicio->diff($fim);
print $intervalo->format('%H:%I:%S');
?>
1 fild recebe $inicio o 2 $fim e o 3 a diferença
Dá uma olhada nos exemplos do manual.
http://php.net/manual/pt_BR/function.date-add.php
Na função add do DateTime você deve passar um objeto do tipo DateInterval e você está passando um DateTime.