infonoide 0 Denunciar post Postado Dezembro 16, 2010 Olá pessoal, Gostaria de uma dica para converte uma string no formato 'dd/mm/YYYY' para date. Sem usar um explode e mktime! Gostaria de uma função mais específica para isto! Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 16, 2010 Gostaria de uma dica para converte uma string no formato 'dd/mm/YYYY' para date. Sem usar um explode e mktime! Gostaria de uma função mais específica para isto! Por quê? Que preconceito... :P Pode usar ER, mas é desnecessário. Todas as funções de data e ora do PHP etsão aqui: http://php.net/manual/en/book.datetime.php dd/mm/yyyy não é padrão, então não a função nativa para essa conversão Compartilhar este post Link para o post Compartilhar em outros sites
Leozitho 81 Denunciar post Postado Dezembro 17, 2010 Gostaria de uma função mais específica para isto! Existe uma função específica para isso sim, é a função strtotime. Exemplo de uso: $data_sql = '2010-12-16'; echo date('d/m/Y', strtotime($data_sql)); Mas como o Beraldo disse, a data precisa estar em um formato padrão e em inglês para funcionar. No exemplo que eu dei a função strtotime converte do formato SQL para TIMESTAMP, e em seguida eu uso a função date pra formatar no formato brasileiro. Se isso não te atender você deve criar uma função própria para converter nos formatos que você precise usar. Um abraço! Compartilhar este post Link para o post Compartilhar em outros sites
Rodrigo Salles 1 Denunciar post Postado Dezembro 17, 2010 Opa!! Olha só, fiz uma função aqui. Acho que vai servir pro seu propósito... não tem segredo. <?php function date_converter($_date = null) { $format = '/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/'; if ($_date != null && preg_match($format, $_date, $partes)) { return $partes[3].'-'.$partes[2].'-'.$partes[1]; } return false; } echo date_converter('17/12/2010'); // saída: 2010-12-17 ?> É isso, aí. Abraço!! Compartilhar este post Link para o post Compartilhar em outros sites
Periscuelo 20 Denunciar post Postado Dezembro 17, 2010 Se a idéia for converter de dd/mm/yyyy para yyyy-mm-dd e vice e versa eu não vejo porque não usar implode e explode. Uma função de 3 linhas resolve. //Função enorme :) function converteData($data, $se, $ss){ return implode($ss, array_reverse(explode($se, $data))); } //Exemplo $data1 = '16/12/2010'; $data2 = '2010-12-17'; $result1 = converteData($data1,'/','-'); $result2 = converteData($data2,'-','/'); //Mostra o Resultado echo $result1.'<br />'.$result2; Ou se achar que passar 3 parametros é muito chato, basta acrescentar um if. //Função enorme :) function converteData($data){ return (preg_match('/\//',$data)) ? implode('-', array_reverse(explode('/', $data))) : implode('/', array_reverse(explode('-', $data))); } //Exemplo $data1 = '16/12/2010'; $data2 = '2010-12-17'; $result1 = converteData($data1); $result2 = converteData($data2); //Mostra o Resultado echo $result1.'<br />'.$result2; Abraços. Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Dezembro 29, 2010 Se a idéia for converter de dd/mm/yyyy para yyyy-mm-dd e vice e versa eu não vejo porque não usar implode e explode. único problema disso, é entre performance e conceito. você tem uma string ai tranforma ela em array ai pega o array, e devolve em string de novo. trabalhar somente com a string, já que a entrada é string e a saída continua sendo string, tende a ser mais rápido(do que fazer a conversão(ida e volta) para array) http://forum.imasters.com.br/index.php?/topic/418063-formatacao-de-data-php/page__p__1646403entry1646403 Compartilhar este post Link para o post Compartilhar em outros sites
Periscuelo 20 Denunciar post Postado Dezembro 29, 2010 trabalhar somente com a string, já que a entrada é string e a saída continua sendo string, tende a ser mais rápido(do que fazer a conversão(ida e volta) para array) Acredito que a performance se equipare, pois a expressão regular varre a string a procura das validações e a concatenação como você mesmo me disse uma vez deixa mais lento o processo. Já as funções por si já fazem o que foi pré determinado, sem nenhum tipo de validação ou concatenação. Sem mensionar que a função pode trabalhar com qualquer formato enviado e retorna o oposto, desobrigando o programador a definir o formato de retorno (yyyy-mm-dd ou dd/mm/yyyy). Então eu acho que acaba dando no mesmo. http://www.phpbrasil.com/script/Iw32TxnpvH9U/converter-data-com-php-em-pt-ou-mysql Abraços. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 29, 2010 Vamos a alguns testes só por farra: date1.php <?php $time = microtime( true ); $date = '2010-12-29'; echo implode( '/', array_reverse( explode( '-', $date ) ) ) . "\n"; var_dump( microtime( true ) - $time ); ?> date2.php <?php $time = microtime( true ); $date = '2010-12-29'; echo preg_replace( '/([0-9]+)-([0-9]+)-([0-9]+)/', '$3/$2/$1', $date ) . "\n"; var_dump( microtime( true ) - $time ); ?> date3.php <?php $time = microtime( true ); $date = '2010-12-29'; vprintf( "%d/%d/%d\n", array_reverse( sscanf( $date, "%d-%d-%d" ) ) ); var_dump( microtime( true ) - $time ); ?> date4.php <?php $time = microtime( true ); $date = '2010-12-29'; sscanf( $date, "%d-%d-%d", $y, $m, $d ); printf( "%d/%d/%d\n", $d, $m, $y ); var_dump( microtime( true ) - $time ); ?> Saídas: date1.php 29/12/2010 float(7.5101852416992E-5) date2.php 29/12/2010 float(0.00013589859008789) date3.php 29/12/2010 float(8.0108642578125E-5) date4.php 29/12/2010 float(6.3180923461914E-5) O mais rápido é o date4.php, que usa sscanf e printf, sem usar array O mais lento é date2.php, o com ER, devido ao tempo de compilação das ERs :thumbsup: Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Dezembro 29, 2010 O mais lento é date2.php, o com ER, devido ao tempo de compilação das ERs :thumbsup: bacana Beraldo. Não tenho como rodar agora, por isso 'só sugeri', mas pela tua saída: date2.php 29/12/2010 float(0.00013589859008789) esse é o menor(absurdamente menor) tempo entre todos ne?! pois os outros possuem uma casa ali depois do ponto flutuante, e a menos que seja 10.00013, o intervalo apresentado é muito menor que os outros. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 29, 2010 Não tenho como rodar agora, por isso 'só sugeri', mas pela tua saída: date2.php 29/12/2010 float(0.00013589859008789) esse é o menor(absurdamente menor) tempo entre todos ne?! pois os outros possuem uma casa ali depois do ponto flutuante, e a menos que seja 10.00013, o intervalo apresentado é muito menor que os outros. parece menor, mas é que os outros estão em notação científica. São todos X*10^-5: todos têm 4 zeros logo após a vírgula. Esse número só tem 3 :) Compartilhar este post Link para o post Compartilhar em outros sites
Leozitho 81 Denunciar post Postado Dezembro 29, 2010 Parabéns pelo teste comparativo Beraldo! :clap: Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 30, 2010 Parabéns pelo teste comparativo Beraldo! :clap: :D Muitas vezes é útil. Principalmente em PHP, que tem um monte de função pronta; você nunca sabe direito o que é mais rápido. Isso fica mais claro em C/C++, por exemplo Compartilhar este post Link para o post Compartilhar em outros sites
Periscuelo 20 Denunciar post Postado Dezembro 30, 2010 Amigo beraldo a função abaixo retorna a data tanto em formato yyyy-mm-dd quanto em dd/mm/yyyy. Basta passar a data em um dos formatos que ela converte para o formato oposto. function converteData($data){ return (preg_match('/\//',$data)) ? implode('-', array_reverse(explode('/', $data))) : implode('/', array_reverse(explode('-', $data))); } Tem como você passar o exemplo da função com sscanf fazendo a mesma coisa? Parabéns pelo comparativo :joia: Abraços. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 30, 2010 Tem como você passar o exemplo da função com sscanf fazendo a mesma coisa? Os dois programas seguidos das duas execuções: beraldo@orion:/tmp$ cat date1.php <?php $time = microtime( true ); function converteData( $data ) { return ( preg_match( '/\//', $data ) ) ? implode( '-', array_reverse( explode( '/', $data ) ) ) : implode( '/', array_reverse( explode( '-', $data ) ) ); } $dateISO = '2010-12-30'; $dateBR = '30/12/2010'; echo converteData( $dateISO ) . "\n"; echo converteData( $dateBR ) . "\n"; var_dump( microtime( true ) - $time ); ?> beraldo@orion:/tmp$ cat date2.php <?php $time = microtime( true ); function converteData( $data ) { if ( ! strstr( $data, '/' ) ) { sscanf( $data, '%d-%d-%d', $y, $m, $d ); return sprintf( '%d/%d/%d', $d, $m, $y ); } else { sscanf( $data, '%d/%d/%d', $d, $m, $y ); return sprintf( '%d-%d-%d', $y, $m, $d ); } return false; } $dateISO = '2010-12-30'; $dateBR = '30/12/2010'; echo converteData( $dateISO ) . "\n"; echo converteData( $dateBR ) . "\n"; var_dump( microtime( true ) - $time ); ?> beraldo@orion:/tmp$ php date1.php 30/12/2010 2010-12-30 float(0.00012302398681641) beraldo@orion:/tmp$ php date2.php 30/12/2010 2010-12-30 float(5.9843063354492E-5) De novo o primeiro parece mais rápido, mas veja a notação científica no date2.php ;) Em PHP parece muito simples usar uma ER, mas em outras linguagens não é assim. Você precisa compilar uma ER. E manter uma ER compilada para usá-la mais de uma vez é muito eficiente. PHP não dá essa ideia, tanto é que a ER é passada como string. Mesmo que você queira manter uma ER compilada e usar mias de uma vez, não dá. Então parece banal usar ER. Porém, segundo o próprio manual do PHP: Tip Do not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster. fonte: http://php.net/manual/en/function.preg-match.php :thumbsup: Compartilhar este post Link para o post Compartilhar em outros sites
Go Back 0 Denunciar post Postado Dezembro 30, 2010 Beraldo... Oi Você tem um compilador PHP, o que é ? O que você usa para mostrar tempo de execução ? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 30, 2010 Beraldo... Oi Você tem um compilador PHP, o que é ? O que você usa para mostrar tempo de execução ? só uso microtime(). Veja bem o código. É só aquilo. microtime() do fim menos microtime do início não é compilador. é o interpretador mesmo, mas rodando em linha de comando apenas para os testes Compartilhar este post Link para o post Compartilhar em outros sites
Go Back 0 Denunciar post Postado Dezembro 30, 2010 Háá... imaginei que fosse o microtime(), só queria confirmar. TKS! Compartilhar este post Link para o post Compartilhar em outros sites
Periscuelo 20 Denunciar post Postado Dezembro 30, 2010 Valew amigo beraldo, vivendo e aprendendo. Da para escrever a função assim também: function converteData($data) { (!strstr($data,'/')) ? sscanf($data,'%d-%d-%d',$y,$m,$d) : sscanf($data,'%d/%d/%d',$d,$m,$y); return (!strstr($data,'/')) ? sprintf('%d/%d/%d',$d,$m,$y) : sprintf('%d-%d-%d',$y,$m,$d); } Só que por ter um if a mais demora um bocadim mais ^_^ Abraços. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 30, 2010 Da para escrever a função assim também: function converteData($data) { (!strstr($data,'/')) ? sscanf($data,'%d-%d-%d',$y,$m,$d) : sscanf($data,'%d/%d/%d',$d,$m,$y); return (!strstr($data,'/')) ? sprintf('%d/%d/%d',$d,$m,$y) : sprintf('%d-%d-%d',$y,$m,$d); } Só que por ter um if a mais demora um bocadim mais ^_^ aqui você faz dois IF's e usa strstr duas vezes :P Compartilhar este post Link para o post Compartilhar em outros sites
jonathan.if 0 Denunciar post Postado Dezembro 16, 2011 Beraldo, mt boa essa sua função, mas se um dos digitos é 06 por exemplo ele so mostra o 6 sabes como arrumar isso? Compartilhar este post Link para o post Compartilhar em outros sites