Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
**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.
Eu faço isso, mas quando posto a identação sai =/
Falando em datas, há uma função nativa para validação: checkdate()
http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
É legal essa função, mas creio que a REGEXP ja supre as necessidades né.
>
É 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.
Hm, não tinha pensado nessa possibilidade.
Vou implementar a função.
EDIT
Função atualizada!.
Agora mostrando a identação.
>
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
Não entendi.
>
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
>
Não entendi.
sei la .. alquem intendeu ae ?? HUhUHuH :P
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
;)
echo number_mask( $data_BR_to_mysql , '##-##-####' ) . "\n"; //14-03-2009
A saída não é uma data válida do MySQL.
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.
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
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 =)