denisbr 0 Denunciar post Postado Julho 12, 2010 Olá a todos, preciso implementar um código para buscar a diferença de data, mas considerando somente o horário comercial. Esse código uso em um sistema de helpdesk. Eu recebo o dia e hora em que uma solicitação de serviço foi aberta pelo cliente, e também o dia e hora em que a solicitação foi assumida por um técnico para atende-la. Assim eu consigo saber qual o tempo em que a solicitação levou para ser atendida desde a abertura (isso para controles de SLA´s, Nível de acordo de serviço). Vou tentar exemplificar a situação, para ver se alguém consegue me ajudar a resolver este problema. Tenho duas datas, a de abertura "Data1" (sendo 01/06/2010 16:00) e de assumida "Data2" (sendo 03/06/2010 11:41). O horário comercial estou considerando como o padrão 08:00 - 12:00 e 13:00 - 18:00 (mas é parametrizável no sistema). No exemplo, eu teria que calcular, 18:00 (hora final do dia) - 16:00 (hora de Data1), retornando 2 horas para o dia 01/06 Para o dia 02/06 (data entre o dia 01/06 e 03/06), eu teria que capturar somente o horário de horas comerciais, no caso 09:00 E para o dia 03/06, eu tenho que considerar somente 08:00 - 11:00 (3 horas) e mais 41 minutos, por causa de Data2. No total, tem que me retornar 14:41 (2+9+3+41), ou seja catorze horas e 41 minutos. Minha dificuldade está sendo em criar uma função para fazer esse tipo de cálculo, uma vez que tanto Data1 pode vir qualquer tipo de data (caindo em sábado, quando não tem horário comercial, sendo meia noite, madrugada, etc), enquanto que Data2 praticamente sempre será dentro do horário comercial. Alguém pode me ajudar? Compartilhar este post Link para o post Compartilhar em outros sites
Daniel Ribeiro 4 Denunciar post Postado Julho 12, 2010 Caro @denisbr Elaborei uma breve função que trata de maneira bem básica o que você precisa, mas retorna somente o intervalo em horas. A função espera um array de horários comerciais com turno matutino e vespertino nessa estrutrura: $horarioComercial = array(8 => 12, 13 => 18); A função também espera outros dois parâmetros, sendo eles a data inicial e a data final a serem comparadas, nessa estrutura: $data1 = '01/06/2010 16:00'; $data2 = '03/06/2010 11:41'; A função abaixo: function calculaIntervaloDatas($data1, $data2, array $horarioComercial = null) { $dataInicial = array(); $dataFinal = array(); $dataInicial = explode('/', implode('/', explode(' ', implode('/', explode(':', $data1))))); $dataFinal = explode('/', implode('/', explode(' ', implode('/', explode(':', $data2))))); $hInicial = $dataInicial[3]; $hFinal = $dataFinal[3]; $dInicial = mktime(0,0,0,$dataInicial[1],$dataInicial[0],$dataInicial[2]); // timestamp da data inicial $dFinal = mktime(0,0,0,$dataFinal[1],$dataFinal[0],$dataFinal[2]); // timestamp da data final $diasPercorridos = array(); while($dInicial <= $dFinal) { $diasPercorridos[] = date("d/m/Y", $dInicial); //convertendo a data no formato dia/mes/ano $dInicial += 86400; // adicionando 1 dia (em segundos) na data inicial } $i = 1; foreach($diasPercorridos as $datas) { // Se for a data inicial if($i == 1) { // Se hInicial for entre 8-12 if(($hInicial >= 8) && ($hInicial <= 12)) { $intervalo1 = ((8 - $hInicial) * -1); } else if(($hInicial >= 13) && ($hInicial <= 18)) { $intervalo1 = (($hInicial - 18) * -1); } // Se for a data final } else if($i == count($diasPercorridos)) { // Se hFinal for entre 8-12 if(($hFinal >= 8) && ($hFinal <= 12)) { $intervalo2 = ((8 - $hFinal) * -1); } else if(($hFinal >= 13) && ($hFinal <= 18)) { $intervalo2 = (($hFinal - 18) * -1); } } else { $intervalo3 += 9; } $i++; } return $intervalo1 + $intervalo2 + $intervalo3; } Utilizando-a da seguinte maneira, com nossa estrutura pré-definida: echo calculaIntervaloDatas($data1, $data2, $horarioComercial); Temos a seguinte saída: 14 OBS: Por ser um trabalho pesado e cansativo, e eu não ter tempo no momento para fazê-lo, deixei totalmente crú. Esta função NÃO IRÁ RESOLVER SEUS PROBLEMAS, visto que foi elaborada para exemplificar a lógica deste trabalhoso desafio. Vou repetir: Tem muita coisa errada neste código e EU SEI. Que ele sirva de exemplo para um trabalho minucioso de correção ou motivação para uma nova função. Decidi deixar pra você a parte mais interessante do algorítimo, que é justamente tratar os minutos e os dias que não constam horários comerciais. Os tratamentos também não estão presentes, como dito anteriormente. Boa sorte. Qualquer coisa pode perguntar que estou aqui. Abraços! Compartilhar este post Link para o post Compartilhar em outros sites
denisbr 0 Denunciar post Postado Julho 13, 2010 Olá Daniel R. Gomes, agradeço sua ajuda e o tempo dedicado no desenvolvimento da função. O seu código está bem desenvolvido e me ajudou bastante. Estou melhorando o mesmo para atender melhor minhas necessidades. Obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
Daniel Ribeiro 4 Denunciar post Postado Julho 13, 2010 Gostaria de deixar a ponderação de alguns ajustes para o melhor funcionamento desta função: - Verificação dos dias da semana (sábado e domingo não consta horário comercial); - Ajuste da função para que retorne o intervalo entre datas com no máximo 1 dia de diferença; - Ajuste da função para que trabalhe também com intervalo entre anos; - Exibição da diferença de minutos; Boa sorte com as melhorias. Se precisar, pode postar aqui mesmo. Um abraço! Compartilhar este post Link para o post Compartilhar em outros sites