Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Willian Faria

Manipulação de Datas

Recommended Posts

Willian Faria

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

Edited by Willian Faria

Share this post


Link to post
Share on other sites
HappyHippyHippo

$teste = date('d/m/Y', mktime(0, 0, 0, $mes, $dia, $ano));

???

e que tal:

$teste = "$mes/$dia/$ano";


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
yoda

Existem várias alternativas :

  • Fazer uma função própria para lidar com as datas;
  • Usar ADODB (http://phplens.com/phpeverywhere/adodb_date_library);
  • Actualizar o PHP para a versão 64 bits (não resolve por completo mas dá uma margem maior);
  • Usar o objecto DateTime em vez da função mktime;

Share this post


Link to post
Share on other sites
Icepick.pt

Aqui há uns tempos atrás escrevi uma função em Javascript para fazer o que tu queres. Talvez consigas resolver o poblema com ela. Só tens que chamar a função, indicando os parametros que queres utilizar. No teu caso acho que será qualquer coisa como:

calculaData('31-03-2013','-47','0','0');

// esta função devolve uma string no formato dd-mm-aaaa que corresponde a:
//    data de inicio + diferença = data de resultado
function calculaData(inicio, diferencaDias,  diferencaMeses,  diferencaAnos){
var dd=inicio.substr(0,2)*1;
var mm=inicio.substr(3,2)*1-1;//janeiro é o 0!
var yyyy=inicio.substr(6,4)*1;

var resultado = new Date();
resultado.setFullYear( (yyyy + diferencaAnos) , (mm + diferencaMeses),(dd + diferencaDias) );
var dd = resultado.getDate();
var mm = resultado.getMonth()+1; //janeiro é o 0!
var yyyy = resultado.getFullYear();
if(dd<10){dd='0'+dd};
if(mm<10){mm='0'+mm};
var resultado = dd + '-' + mm + '-' + yyyy;
return resultado;

}

Share this post


Link to post
Share on other sites
HappyHippyHippo

Aqui há uns tempos atrás escrevi uma função em Javascript para fazer o que tu queres.

porque estás a responder com javascript numa secção de PHP, onde a pergunta era de PHP onde a pessoa refere que tem problemas com criação de uma texto em PHP com uma data criada e manipulada em PHP ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Icepick.pt

Porque não sei se a data é mesmo criada em PHP ou se é originária do utilizador.

Porque nem sempre a solução que procuramos acaba por se provar a melhor.

Porque o William perguntou ' que outra alternativa pode ser usada'.

Porque tenho o hábito de manter uma mente aberta na resolução de problemas, em vez de estreitar as possibilidades sem uma justificação razoável.

Porque provávelmente a função até pode vir a servir no futuro para outra pessoa qualquer com o mesmo problema ou outro semelhante, mesmo que não sirva para o William.

Porque não tenho a possibilidade de mudar o tópico para a secção de Javascript, nem acho que ela pertença lá.

Em todo o caso, podes sempre remover a resposta se achares que é desapropriada.

Edited by Icepick.pt

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu nem sou moderador nem nunca removeria um post de uma pessoa (desde que este não fosse claramente ofensivo)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.