Ir para conteúdo

Arquivado

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

infonoide

Converter string em date

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

×

Informação importante

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