Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

André D. Molin

Função para converter datas do MySQL e vice-versa

Recommended Posts

Sempre estamos lidando com um banco de dados em nossasaplicações. E é muito comum executarmos tarefas que convertem a datapadrão do MySQL (YYYY-MM-DD) para o padrão brasileiro (DD/MM/YYYY), e vice-versa.

 

Pensando nisso que há alguns dias atrás criei uma função que fizesseisso. Porém tinha um "problema". A função tinha 2 parâmetros, oprimeiro a data, e o segundo um verificador para saber se a data emquestão está no formado do MySQL ou do Brasil.

 

E hoje eu resolvi mudar ela, onde esta tarefa é feita automaticamente agora.

 

Bom, chega de lero lero. Segue a função abaixo:

 

<?php
/**
* Função que converte uma data de YYYY-MM-DD para DD/MM/YYYY e vice-versa.
* O tipo da data é automaticamente detectado. Caso não seja nenhum dos dois, a função
* retorna uma mensagem de erro.
*
* @author André D. Molin <contato@dmolin.com.br>
* @version 1.2
* @since 02/09/2009
*
* @string $data (YYYY-MM-DD ou DD/MM/YYYY)
*/

   function ConverterDataDB ($data) {

       $patternBr    = "^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)[0-9]{2}^";
       $patternMySQL = "^(19|20)[0-9]{2}[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])^";

       if ( preg_match($patternBr, $data, $matchesBr) === 1 ) {

           if ( checkdate($matchesBr[1], $matchesBr[0], $matchesBr[2]) ) {

               trigger_error('A data '.$data.' é inválida', E_USER_ERROR);

           }

           $output = implode('-', array_reverse(explode('/', $data)));

       } elseif ( preg_match($patternMySQL, $data, $matchesMySQL) === 1 ) {

           if ( checkdate($matchesMySQL[1], $matchesMySQL[2], $matchesMySQL[0]) ) {

               trigger_error('A data '.$data.' é inválida', E_USER_ERROR);

           }

           $output = implode('/', array_reverse(explode('-', $data)));

       } else {

           trigger_error('A data '.$data.' é inválida', E_USER_ERROR);

       }

       return $output;

   }

?>

 

Exemplos de uso:

 

<?php

echo ConverterDataDB('21/03/1985');
// 1985-03-21

echo ConverterDataDB('1985-03-21');
// 21/03/1985

/* ************************ */
/* FORÇANDO DATAS INVÁLIDAS */
/* ************************ */

echo ConverterDataDB('45/02/1990');
// Irá retornar erro

echo ConverterDataDB('5/4/92');
// Irá retornar erro

?>

 

 

Espero que tenha ajudado.

http://www.dmolin.co...-data-do-mysql/

Compartilhar este post


Link para o post
Compartilhar em outros sites

bahh fico bem bacana .. pratico de usa.. parabens ae andre =]

 

ps: so pra fica mais facil pra galera estuda a funcao da uma identada no script http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

valwww =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

É legal essa função, mas creio que a REGEXP ja supre as necessidades né.

 

Não totalmente.

A ER não impede a inserção da data 29 de fevereiro num ano que não seja bissexto, por exemplo.

Checkdate faz essa verificação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hm, não tinha pensado nessa possibilidade.

 

Se o objetivo for apenas formatar, então a validação pode não ser necessária e você pode utilizar sscanf em conjunto com vsprintf:

$data = '11/09/2009';
echo vsprintf( '%02d-%02d-%04d' , sscanf( $data , '%2d/%2d/%4d' ) ); //11-09-2009

Agora, se você não souber previamente a entrada, você pode interpretá-la:

function number_mask( $value , $mask ){
    $value = preg_replace( '/[^\d]+/' , '' , $value );

    if ( $mask === '#' ) return $value;
    else {
        for ( $i = 0 , $j = 0 , $t = strlen( $mask ) , $fi = $fo = null ; $i < $t ; $i++ ){
            if ( ( $mask{ $i } !== '#' ) && $j ){
                $fi  = sprintf( '%s%%%dd' , $fi , $j );
                $fo = sprintf( '%s%%0%dd%s' , $fo , $j , $mask{ $i } );
                $j = 0;
            } elseif ( $mask{ $i } == '#' ) ++$j;
            else $fo .= $mask{ $i };
        }

        if ( $j ){
            $fi = sprintf( '%s%%%dd' , $fi , $j );
            $fo = sprintf( '%s%%0%dd' , $fo , $j );
        }

        return vsprintf( $fo , sscanf( $value , $fi ) );
    }
}

echo number_mask( '16 99999999'    , '55+ (##) ####-####' ) . "\n"; //55+ (16) 9999-9999
echo number_mask( '14444444'       , '##.###-###'         ) . "\n"; //14.444-444
echo number_mask( '11111111111'    , '###.###.###-##'     ) . "\n"; //111.111.111-11
echo number_mask( '00000000000100' , '##.###.###/####-##' ) . "\n"; //00.000.000/0001-00
echo number_mask( '14/03/2009'     , '##-##-####'         ) . "\n"; //14-03-2009
echo number_mask( '14-03-2009'     , '##/##/####'         ) . "\n"; //14/03/2009
echo number_mask( '14-03-2009'     , '#'                  ) . "\n"; //14032009

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi.

 

Nem eu, Mestre Jedi :lol:

 

Sobre a funçãoeu já fazia isso mas manual, sem uma função. A verificaçãose era válida ou não fazia antes, patra personalizar o erro apresentado (já que vai par um array a ser interpretado pelo template).

 

Mas é muito boa sim http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se a idéia é formatar um número essa função faz o trabalho, independente de ser uma data, CEP, telefone ou qualquer que seja o número.

Da mesma forma que o printf imprime formatado, o sscanf interpreta um formato e retorna uma matriz de correspondências. Se utilizar essa matriz em conjunto com vsprintf você consegue fazer uma função mais "genérica" que consegue adicionar uma máscara em qualquer tipo de número:

 

$telefone = '1699999999';
$CEP = '14444444';
$CPF = '11111111111';
$CNPJ = '00000000000100';
$data_BR_to_mysql = '14/03/2009';

echo number_mask( $telefone , '55+ (##) ####-####' ) . "\n"; //55+ (16) 9999-9999
echo number_mask( $CEP , '##.###-###' ) . "\n"; //14.444-444
echo number_mask( $CPF , '###.###.###-##' ) . "\n"; //111.111.111-11
echo number_mask( $CNPJ , '##.###.###/####-##' ) . "\n"; //00.000.000/0001-00
echo number_mask( $data_BR_to_mysql , '##-##-####' ) . "\n"; //14-03-2009

E como no início ela retira da string qualquer coisa que não for um número, mesmo que o usuário passe um número de telefone com uma formatação qualquer ela irá formatar corretamente:

 

Supondo essas possíveis entradas do usuário:

$t1 = '1699999991';
$t2 = '16 99999992';
$t3 = '(16) 9999-9993';
$t4 = '16-9999-9994';
$t5 = '16 - 9999.9995';

echo number_mask( $t1 , '55+ (##) ####-####' );
echo number_mask( $t2 , '55+ (##) ####-####' );
echo number_mask( $t3 , '55+ (##) ####-####' );
echo number_mask( $t4 , '55+ (##) ####-####' );
echo number_mask( $t5 , '55+ (##) ####-####' );

A saída será:

55+ (16) 9999-9991
55+ (16) 9999-9992
55+ (16) 9999-9993
55+ (16) 9999-9994
55+ (16) 9999-9995

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função do João é para aplicar máscaras, e não para converter no formato do banco.

Ainda acho que vcs exageram muito nesses assuntos.

 

Se tá trazendo a data do banco, já formata ela no SQL.

Se vai inserir, dá um explode e inverte a ordem.. pronto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal

Tava vendo essa função mas não consegui aplica-la ao meu formulário, onde pego duas datas " $dataEntrada e $dataSaida " para gravar no mysql, ja tentei assim mas não deu - em outro trabalho etá funcionou mas nesse não sei o que acontece

 

 $data = explode('/',$_GET['dataEntrada']);
 if(!checkdate($data[1],$data[0],$data[2]))
 {
 print'alert("A data é inválida");';
 return;
 }

como acima ele insere a data em branco 0000/00/00.

 

Bom mas é assim:

Eu tenho esse form, onde pego as datas vindas de um calendário em javascript e tal:

		]
 <label>Data de Entrada:
 <input type="text" name="dataEntrada" id="dataEntrada" value="<?php echo "$dataEntrada"; ?>"></label>
 <img class="f_btn1" id="f_btn1" src="../img/calendar.jpg" alt="SELECIONE A DATA DESEJADA" width="16" height="15" />
 <label>Data de Saída
 <input type="text" name="dataSaida" id="dataSaida" value="<?php echo "$dataSaida"; ?>" ></label>
 <img class="f_btn2" id="f_btn2" src="../img/calendar.jpg" alt="SELECIONE A DATA DESEJADA" width="16" height="15" />

 

Depois preciso ao axecutar a ação gravar a data no mysql, e depois recuperala em outra página no formato BR dd/mm/yyyy, entende, só que ele não tá gravando a data.

bom meu script para inserir está assim:

<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
include "conect_sql.php"; 

$id_select = $_GET['id_pacote'];
 $tipoPacote = $_POST['tipoPacote'];
  $descricao = $_POST['descricao'];
   $valor = $_POST['valor'];
    $dataEntrada = $_POST['dataEntrada'];
     $dataSaida = $_POST['dataSaida'];
      $ativado = $_POST['ativado'];
       $obs = $_POST['obs'];
              if (isset($_POST['id'])){

 $sql = "INSERT INTO pacotesbarracas (id_pacote,
                                 tipoPacote,
                                 descricao,
                                 valor,
                                 dataEntrada,
                                 dataSaida,
                                 ativado,
                                 obs)
	VALUES (NULL,
	        '$tipoPacote',
		 '$descricao',
		  '$valor',
		   '$dataEntrada',
		    '$dataSaida',
		     '$ativado',
		      '$obs')";
 $result = mysql_query($sql) or die(mysql_error());
 header("Location: pacotes.php");
 }
?>

 

Minha questão é como ficaria o código para inserir a data corretamente - 2009-12-12 - e depois para recupera-la no formato que eu preciso - 12-12-2009 .

 

Galera se alguém puder me ajudar, eu agradeço

depois de pronto eu posto o código pronto pra galera que estiver preciasando também poder usar

falow

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.