Estes dias estava lendo um livro de algoritmos e tinha alguns algoritmos utilizando DIV e MOD.
A idéia seria pegar as partes de uma data no formato AAAAMMDD e colocar no formato DDMMAAAA.
Claro, eu como programador PHP já fui logo pensando em strpos(), mas ai o livro mostrava uma abordagem matemática interessante e global para outras linguagem.
lang="sql
data <- 20110829
ano <- data DIV 10000 // retorna 2011
dia <- data MOD 100 // retorna 29
A lógica é a seguinte:
Pegar a data e dividir por 10000 retorna o ano.
Como é uma divisão exata, o total zeros do divisor é o total de números que vão ser removido e o quociente é o ano que desejamos.
lang="sql
2011|0829 // estes 4 dígitos finais serão removidos
1|0000
Pegar a data e fazer uma operação com Módulo 100 retona o dia.
O total de zeros passados no módulo é o total de digitos finais do número que vão ser retornados:
lang="sql
201108|29 // estes 2 digitos finais serão retornados
1|00
Tá e como fica o Mês?
Bem, o mês… eh… ahum, sim o mês! Claro o mês! 😀
O Mês está no meio, estão seguindo a lógica da pra criar algo:
lang="sql
data <- 20110829
ano <- data DIV 10000 // retorna 2011
auxiliarMes <- data DIV 100 // retorna 201108
mes <- auxiliarMes MOD 100 // retorna 08
dia <- data MOD 100 // retorna 29
Vou deixar você entender sozinho o que aconteceu ali em cima.
O PHP no seu núcleo não tem um operador para DIV somente para MOD, que é o % (porcento).
Ai para inventar moda, e com um jeitinho brasileiro criei estas duas funções:
/**
* Retorna o módulo de uma divisão
*/
function MOD( $number, $base ) {
return $number % $base;
}
/**
* Retorna o resto de uma divisão
*/
function DIV( $number, $base ) {
return floor( $number / $base );
}
Na função DIV eu utilizei a função nativa do PHP floor() que arredonda para baixo, pois dividindo o número 20110829 por 10000 resultaria no quociente 2011.0829.
Ai, no caso de datas fica assim:
$data = 20110829;
$dia = MOD( $data, 100 );
$auxiliarMes = DIV( $data, 100 );
$mes = MOD( $auxiliarMes, 100 );
$ano = DIV( $data, 10000 );
echo sprintf("%02s%02s%04s",$dia,$mes,$ano);
Utilizei a função de formatação sprintf(), pois caso o dia ou o mês precise do zero na frente, pelo fato de ser uma divisão não retornaria o zero na frente.
Bom, é isto, espero que tenha ajudado os malucos!