Ir para conteúdo

Arquivado

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

Willianjdf

Manipulação de Datas

Recommended Posts

Prezados:

Em relação a função mktime:
Suponha que utilizemos esta função da seguinte forma:
$teste = date('d/m/Y', mktime(0, 0, 0, $mes, $dia, $ano));
Atribuindo a variavel $ano o ano 2013, a variavel $teste conterá o valor: 31/03/2013
Porém se é passado a variavel $ano o ano igual ou maior que 2038 a variavel $teste esta recebendo o valor: 01/01/1970
Sendo assim que a função mktime não manipula datas inferior a 1970 e superior a 2037.
Estou tendo trabalar com esta linha de comando para subtrair um periodo de dias de uma data obtida pelo algoritmo de Delambre que tem como finalidade retornar a data da Pascoa e assim com base nesta infomração obter a data da terça-feira de carnaval que é 47 dias anteriores a data da pascoa.
Então como faço para resolver este problema? Que função substitui a função mktime ou que outra alternativa pode ser usada?

Obs.: Há um bug conhecido com easter_date () que pode retornar datas incorretas de alguns anos:
Ele está aparentemente relacionado com as configurações de fuso horário. Segundo o site: www.php.net

Assim como houve a previsão de problemas na passagem do milénio (o bug do milénio), já se espera um problema para o ano de 2038 desta vez associado à data no formato marca temporal UNIX.[2]
http://pt.wikipedia.org/wiki/Era_Unix#Problemas

Willian

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ja tentou usar a função date do PHP para obter a data atual

 

$data = date('d/m/Y');

ou usar a getdate() que ira lhe retornar uma array

 

$dataArray = getdate();

echo '<pre>';
 print_r($dataArray);
echo '<pre>';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alexandre:

 

Segue meu código para você observar. Me explique como faço para aplicar esses comando que você disse. O date eu já estou usando.

Como você pode ver meu código não funciona em anos posteriores a 2037.

 

////////////////////////////////////////////
///// Inicio do algoritmo de Delambre //////
////////////////////////////////////////////
function pascoa($ano){
$a = $ano % 19;
$b = floor($ano / 100);
$c = $ano % 100;
$d = floor($b / 4);
$e = $b % 4;
$f = floor(($b + 8) / 25);
$g = floor(($b - $f + 1) / 3);
$h = ((19*$a + $b - $d - $g + 15) % 30);
$i = floor($c / 4);
$k = ($c % 4);
$l = ((32 + 2*$e + 2*$i - $h - $k) % 7);
$m = floor(($a + 11*$h + 22*$l) / 451);
$mes = floor(($h + $l - 7*$m + 114) / 31);
$dia = (($h + $l - 7*$m + 114) % 31)+1;
$periodo = 47;
////////////////////////////////////////////
///// Fim do algoritmo de Delambre /////////
////////////////////////////////////////////
$teste = date('d/m/Y', mktime(0, 0, 0, $mes, $dia - $periodo, $ano));// O problema esta nesta linha de código.
echo "O Carnaval em ".$ano. " é em: " . $teste . "<br />";
echo"</br>";
}
pascoa(1969);
pascoa(1970);
pascoa(2037);
pascoa(2038);
pascoa(2039);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usa intval no lugar do floor

na formula da pascoa o resultado tem que ser um inteiro(int) e não o menor inteiro

$a = $ano % 19;
    $b = intval($ano / 100);
    $c = $ano % 100;
    $d = intval($b / 4);
    $e = $b % 4;
    $f = intval(($b + 8) / 25);
    $g = intval(($b - $f + 1) / 3);
    $h = ((19*$a + $b - $d - $g + 15) % 30);
    $i = intval($c / 4);
    $k = ($c % 4);
    $l = ((32 + 2*$e + 2*$i - $h - $k) % 7);
    $m = intval(($a + 11*$h + 22*$l) / 451);
    $mes = intval(($h + $l - 7*$m + 114) / 31);
    $dia = (($h + $l - 7*$m + 114) % 31)+1;
    $periodo = 47;
     
    $teste = date('d/m/Y', mktime(0, 0, 0, $mes, $dia - $periodo, $ano));
    echo "O Carnaval em ".$ano." é em: " .$teste."<br />";
    echo"</br>";

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.