Jump to content

Verificar Horas no PHP


Ontech

Recommended Posts

Boas noites,

Estou a desenvolver uma aplicação para marcação de aulas de grupo onde tenho guardadas apenas as horas no formato H:i, os dias de semana  de 0 (Domingo) - 6 (Sabado) e o nome da aula.

O que precisava era verificar as horas menor que 12:45 e maior que 12:45 para poder definir o tempo de antecedência para a marcação. Alguém já teve um problema idêntico?

Obrigado Cumprimentos.

Link to comment
Share on other sites

15 minutos atrás, HappyHippyHippo disse:

podes desenvolver o problema ?

A nível de base de dados é o seguinte:

eHwaTCC.png

 

Estou a utilizar o framework CodeIgniter e tenho o seguinte código:


 

    /*Tempo definido na configuração para poder fazer uma marcação nas aulas (48h)*/
        $tempo_inscricao = 48 + 24; //Tempo de Inscrição
        //Data atual
        $inicio = new DateTime();

        //Data final
        $fim = new DateTime();
        $fim->modify('+' . $tempo_inscricao . '  hours');

        //Intervalo de 1 Dia
        $interval = new DateInterval('P1D');
        $periodo = new DatePeriod($inicio, $interval, $fim);

        $count = 0;
        //Percorrer a data
        foreach ($periodo as $data) {
            //Se for o próprio dia
            if ($count == 0) {
                echo 'Dia Atual: ';
                echo $data->format("w") . '<br>';
                $hora = $data->format("H:i");

                $this->db->select("Horario.id AS ID,
                                   Horario.dia_semana_id AS DIASEMANA,
                                   DATE_FORMAT(STR_TO_DATE(Horario.hora,'%H:%i'),'%H:%i') AS HORA,
                                   Horario.duracao AS DURACAO,
                                   Modalidades.nome AS MODALIDADE,
                                   Clubes.nome AS CLUBE");
                $this->db->from('Horario');
                $this->db->join('ClubeModalidades', 'Horario.clube_modalidade_id = ClubeModalidades.id', 'inner');
                $this->db->join('Modalidades', 'ClubeModalidades.modalidade_id = Modalidades.id', 'inner');
                $this->db->join('Clubes', 'ClubeModalidades.clube_id = Clubes.id', 'inner');
                $this->db->where("HORA>DATE_FORMAT(STR_TO_DATE('$hora','%H:%i'), '%H:%i')");
                $this->db->where('Horario.dia_semana_id', $data->format('w'));
                $this->db->where('Clubes.id', 2);
                $this->db->where('Horario.estado', '1');


                $resultado = $this->db->get()->result();

                foreach ($resultado as $dados){
                    echo $dados->HORA.' - '.$dados->MODALIDADE.'<br>';
                }
                
                echo '<hr>';

                $count++;


                //Se não
            } else {
             $hora = $data->format("H:i");

                
                $this->db->select("Horario.id AS ID,
                                   Horario.dia_semana_id AS DIASEMANA,
                                   DATE_FORMAT(STR_TO_DATE(Horario.hora,'%H:%i'),'%H:%i') AS HORA,
                                   Horario.duracao AS DURACAO,
                                   Modalidades.nome AS MODALIDADE,
                                   Clubes.nome AS CLUBE");
                $this->db->from('Horario');
                $this->db->join('ClubeModalidades', 'Horario.clube_modalidade_id = ClubeModalidades.id', 'inner');
                $this->db->join('Modalidades', 'ClubeModalidades.modalidade_id = Modalidades.id', 'inner');
                $this->db->join('Clubes', 'ClubeModalidades.clube_id = Clubes.id', 'inner');
                //$this->db->where("HORA>DATE_FORMAT(STR_TO_DATE('$hora','%H:%i'), '%H:%i')");
                $this->db->where('Horario.dia_semana_id', $data->format('w'));
                $this->db->where('Clubes.id', 2);
                $this->db->where('Horario.estado', '1');


                $resultado = $this->db->get()->result();

                foreach ($resultado as $dados){
                    echo $dados->HORA.' - '.$dados->MODALIDADE.'<br>';
                }
                
                //echo '<hr>';
                //echo $data->format("w");
                echo '<hr>';
            }

            // Dia da Semana (0-Domingo 6-Sabado)
        }

 

O que pretendia era comparar as horas ou seja:

Para fazer uma marcação em uma aula até as 12:45 é necessário fazer com 12h de antecedência e para fazer a marcação em uma aula a partir de 12:45 é com 6h de antecedência.

como defino essas 6h e essas 12h?

Edited by Ontech
Link to comment
Share on other sites

3 minutos atrás, HappyHippyHippo disse:

novamente ... não foste claro o suficiente para da ruma resposta concreta ...

queres obter registos da base de dados mediante uma regra ou o quê afinal ?

Quero criar uma regra que me devolva as aulas que posso fazer a marcação com estas regras:  Para fazer uma marcação em uma aula até as 12:45 é necessário fazer com 12h de antecedência e para fazer a marcação em uma aula a partir de 12:45 é com 6h de antecedência. para poder por um botão de marcação na pagina.

Link to comment
Share on other sites

Penso que não fui claro o suficiente, vou tentar explicar de uma melhor forma:

Eu tenho a tabela horario que pretende ao qual o objetivo é criar o horario das aulas de grupo de um ginásio sendo que os campos que mais se evidenciam são:

  • dia_semana_id - Este varia de 0 - Domingo a 6 - Sábado.
  • clube_modalidade_id - Indica a modalidade e o clube a que pertence.
  • hora - Indica a hora do inicio da aula de grupo

O Que pretendo é que a partir da data atual e num período definido pelo "administrador" que ficará numa tabela configurações a função me devolva as aulas a que é possível efectuar a marcação tendo em conta o seguinte:

  • As aulas que estejam na tabela horario com uma data inferior ou igual a 12:45 para ser marcadas precisam de ser marcadas com 12h de antecedência e as restantes com 6h de antecedência.

Eu criei a seguinte função que me mostra as aulas neste caso num período de 48h definido na variável $tempo_inscricao.

        /*Tempo definido na configuração para poder fazer uma marcação nas aulas (48h)*/
        $tempo_inscricao = 48 + 24; //Tempo de Inscrição
        //Data atual
        $inicio = new DateTime();

        //Data final
        $fim = new DateTime();
        $fim->modify('+' . $tempo_inscricao . '  hours');

        //Intervalo de 1 Dia
        $interval = new DateInterval('P1D');
        $periodo = new DatePeriod($inicio, $interval, $fim);

 $count = 0;
        
        //Percorrer a data
        foreach ($periodo as $data) {
            $data1 = $data;
             $data->format('Y-m-d H:i w').'<br>';
   
            //Se for o próprio dia
            if ($count == 0) {
                echo 'Dia Atual: ';
                echo $data->format("w") . '<br>';
                $hora = $data->format("H:i");
                
  

                $this->db->select("Horario.id AS ID, 
                                   Horario.dia_semana_id AS DIASEMANA, 
                                   DATE_FORMAT(STR_TO_DATE(Horario.hora,'%H:%i'),'%H:%i') AS HORA, 
                                   Horario.duracao AS DURACAO, 
                                   Modalidades.nome AS MODALIDADE, 
                                   Clubes.nome AS CLUBE");
                $this->db->from('Horario');
                $this->db->join('ClubeModalidades', 'Horario.clube_modalidade_id = ClubeModalidades.id', 'inner');
                $this->db->join('Modalidades', 'ClubeModalidades.modalidade_id = Modalidades.id', 'inner');
                $this->db->join('Clubes', 'ClubeModalidades.clube_id = Clubes.id', 'inner');
                $this->db->where("HORA>DATE_FORMAT(STR_TO_DATE('$hora','%H:%i'), '%H:%i')");
                $this->db->where('Horario.dia_semana_id', $data->format('w'));
                $this->db->where('Clubes.id', 2);
                $this->db->where('Horario.estado', '1');


                $resultado = $this->db->get()->result();

                foreach ($resultado as $dados){
                    //echo $dados->HORA.' - '.$dados->MODALIDADE.'<br>';
         
                   $teste = str_replace(':', '', $dados->HORA);
                   var_dump($data1);
                   if($teste <= 1245){
                       //Verificar as 12 h
                       
                       

                       
                       
                   }else{
                       // Verificar 6H

 
                   }
                    
                }
                
                echo '<hr>';

                $count++;


                //Se não
            } else {
             $hora = $data->format("H:i");

                
                $this->db->select("Horario.id AS ID, 
                                   Horario.dia_semana_id AS DIASEMANA, 
                                   DATE_FORMAT(STR_TO_DATE(Horario.hora,'%H:%i'),'%H:%i') AS HORA, 
                                   Horario.duracao AS DURACAO, 
                                   Modalidades.nome AS MODALIDADE, 
                                   Clubes.nome AS CLUBE");
                $this->db->from('Horario');
                $this->db->join('ClubeModalidades', 'Horario.clube_modalidade_id = ClubeModalidades.id', 'inner');
                $this->db->join('Modalidades', 'ClubeModalidades.modalidade_id = Modalidades.id', 'inner');
                $this->db->join('Clubes', 'ClubeModalidades.clube_id = Clubes.id', 'inner');
                //$this->db->where("HORA>DATE_FORMAT(STR_TO_DATE('$hora','%H:%i'), '%H:%i')");
                $this->db->where('Horario.dia_semana_id', $data->format('w'));
                $this->db->where('Clubes.id', 2);
                $this->db->where('Horario.estado', '1');


                $resultado = $this->db->get()->result();

                foreach ($resultado as $dados){
                   $teste = str_replace(':', '', $dados->HORA);
                   
                   if($teste <= 1245){
                       
                         echo 'Dados Inferiores a ou iguais a 12:45:'. $dados->HORA.' - '.$dados->MODALIDADE. '-'.$teste.'<br>';

                   }else{
                         echo 'Dados Superiores a 12:45:'. $dados->HORA.' - '.$dados->MODALIDADE. '-'.$teste.'<br>';

                   }
                }
                
                //echo '<hr>';
                //echo $data->format("w");
                echo '<hr>';
            }

            // Dia da Semana (0-Domingo 6-Sabado)
        }

Resolvi o problema para verificar se a hora era superior ou nao a 12:45 da seguinte forma:

                   $teste = str_replace(':', '', $dados->HORA);
                   
                   if($teste <= 1245){
                         echo 'Dados Inferiores a ou iguais a 12:45:'. $dados->HORA.' - '.$dados->MODALIDADE. '-'.$teste.'<br>';
                   }else{
                         echo 'Dados Superiores a 12:45:'. $dados->HORA.' - '.$dados->MODALIDADE. '-'.$teste.'<br>';
                   }

O que precisava agora era fazer uma comparação da hora atual com a que se encontra na tabela horários e permitir ou não a inscrição.

Ou uma melhor sugestão a nível de implementação de horários e inscrições...

Obrigado

Cumprimentos

Link to comment
Share on other sites

continuas a não ser específico o suficiente.

pretendes ter uma solução ao nível do SQL, seja ele por filtragem dos horários ou marcação destes da possibilidade de agendamento, ou queres uma solução ao nível do PHP que irá analisar o registo ?

ps : suponho que seja o último, mas como estás sempre a falar do SQL ...

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Agora, HappyHippyHippo disse:

continuas a não ser específico o suficiente.

pretendes ter uma solução ao nível do SQL, seja ele por filtragem dos horários ou marcação destes da possibilidade de agendamento, ou queres uma solução ao nível do PHP que irá analisar o registo ?

Pretendo uma solução a nivel de PHP, uma vez que o horário é baseado nos dias de semana e não em uma data especifica. Sendo calculadas as datas disponiveis através do php.

Ou seja um exemplo prático:

Tenho na tabela horario o seguinte registo:

  • id: 1
  • dia_semana_id: 5 (Sexta-feira)
  • hora: 11:45
  • modalidade: WOD

Quero que a função pegue no dia de atual verifique se a aula está dentro do tempo de marcação por exemplo 48h,  verifique se a hora da aula é inferior ou igual a 12:45 para ser definido o tempo de antecedência de marcação. No exemplo do registo acima o tempo de antecedência é de 12h porque 11:45 é menor ou igual a 12:45 iria comparar o dia e hora atual com o de amanhã (Sexta Feira - 5) e se for superior a 12h devolve que é possivel senão impossivel de fazer a marcação.

Consegui ser um pouco mais especifico?

Link to comment
Share on other sites

2 minutos atrás, HappyHippyHippo disse:

antes de dar a solução ... podes-me dizer o que diferencia uma horário desta sexta-feira com um horário da próxima sexta-feira ?

A diferença é nenhuma é só a data e não é possível fazer a inscrição nessa aula porque desde o dia de hoje até a próxima sexta-feira ultrapassa as 48h do tempo de possível para a marcação.

Link to comment
Share on other sites

Agora, HappyHippyHippo disse:

agora vira isso ao contrário

coo defines que um registo existente na base de dados é desta sexta-feira ou foi da sexta-feira passada ?

Quando a  pessoa faz a marcação é guardada a data do dia exacto da marcação num campo data que ainda não coloquei na tabela Marcações. Isto ira permitir listar as pessoas inscritas em uma determinada data e aula que pertencerá a tabela horário.

Link to comment
Share on other sites

ok, agora que sei que sabes que existe esse pequeno senão no ambiente apresentado anteriormente, o que tens de fazer em PHP, será algo deste género:

<?php
function getRecordTime($weekday, $rectime) {
    list($hours, $minutes) = explode(':', $rectime);
    $time = $hours * 3600 + $minutes * 60;

    $dayinc = 0;
    if (date('N') != $weekday) {
        switch ($weekday) {
            case 1: $dayname = 'Monday';    break;
            case 2: $dayname = 'Tuesday';   break;
            case 3: $dayname = 'Wednesday'; break;
            case 4: $dayname = 'Thursday';  break;
            case 5: $dayname = 'Friday';    break;
            case 6: $dayname = 'Saturday';  break;
            case 7: $dayname = 'Sunday';    break;
        }
        $day = strtotime('next ' . $dayname);
    } else
        $day = strtotime('today');

    return $day + $time;
}

function getRecordLimits($time, $rectime) {
    list($hours, $minutes) = explode(':', $rectime);
    
    $threshold = $hours > 12 || $hours == 12 && $minutes > 45 ? 6 : 12;

    $date = date("Y-m-d H:i:s", $time);
    return [strtotime($date . ' - 48 hours'),
            strtotime($date . ' - ' . $threshold . ' hours')];
}

$now = strtotime('now');
foreach ($resultado as $dados){
    list($limit_inf, $limit_sup) = getRecordLimits(getRecordTime($dados->DIASEMANA, $dados->HORA), $dados->HORA);
    if ($limit_inf <= $now && $limit_sup >= $now) {
        // ok ... eu posso fazer a marcação
    }
}
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Muito obrigado pela sua disponibilidade e ajuda, agora já consegui todas as aulas às quais me posso inscrever dentro daqueles limites, como contribuição, aqui está a forma a funcionar com o Codeigniter 3:

helpers/marcacao_helper.php

function getRecordTime($weekday, $rectime) {

    list($hours, $minutes) = explode(':', $rectime);
    $time = $hours * 3600 + $minutes * 60;

    if (date('N') != $weekday) {
        switch ($weekday) {
            case 1: $dayname = 'Monday';
                break;
            case 2: $dayname = 'Tuesday';
                break;
            case 3: $dayname = 'Wednesday';
                break;
            case 4: $dayname = 'Thursday';
                break;
            case 5: $dayname = 'Friday';
                break;
            case 6: $dayname = 'Saturday';
                break;
            case 7: $dayname = 'Sunday';
                break;
        }

        $day = strtotime('next ' . $dayname);

    } else {

        $day = strtotime('today');

    }

    return $day + $time;
}


function getRecordLimits($time, $rectime) {
    list($hours, $minutes) = explode(':', $rectime);
    
    $threshold = $hours > 12 || $hours == 12 && $minutes > 45 ? 6 : 12;
    
    $date = date("Y-m-d H:i:s", $time);
    
    return [strtotime($date . ' - 48 hours'),
            strtotime($date . ' - ' . $threshold . ' hours')];
}

No Controller:

public function aulasDisponiveisMarcacao() {
        $this->db->select("Horario.id AS ID, 
                                   Horario.dia_semana_id AS DIASEMANA, 
                                   Horario.hora AS HORA, 
                                   Horario.duracao AS DURACAO, 
                                   Modalidades.nome AS MODALIDADE, 
                                   Clubes.nome AS CLUBE");
        $this->db->from('Horario');
        $this->db->join('ClubeModalidades', 'Horario.clube_modalidade_id = ClubeModalidades.id', 'inner');
        $this->db->join('Modalidades', 'ClubeModalidades.modalidade_id = Modalidades.id', 'inner');
        $this->db->join('Clubes', 'ClubeModalidades.clube_id = Clubes.id', 'inner');
        $this->db->where('Clubes.id', 2);
        $this->db->where('Horario.estado', '1');
        $this->db->order_by('Horario.dia_semana_id,  HORA', 'asc');

        $resultado = $this->db->get()->result();

        $this->load->helper('marcacao');
        $now = strtotime('now');

        foreach ($resultado as $dados) {
            list($limit_inf, $limit_sup) = getRecordLimits(getRecordTime($dados->DIASEMANA, $dados->HORA), $dados->HORA);

            if ($limit_inf <= $now && $limit_sup >= $now) {
                echo 'Pode inscrever-se na aula de: ' . $dados->MODALIDADE . '. na data ' . date('d-m-Y', getRecordTime($dados->DIASEMANA, $dados->HORA)) . ' às ' . $dados->HORA;
                echo '<hr>';
            }
        }
    }
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.