Jump to content


Photo

Problema Com Mktime


  • Faça o login para participar
3 replies to this topic

#1 fekz

fekz

    12 Horas

  • Usuários
  • 243 posts
  • Sexo:Não informado

Posted 05/05/2011, 16:38

Pessoal, estou com o seguinte problema. Eu estou desenvolvendo um sistemas de contas a pagar e a receber. Quando a pessoa parcela uma conta em 10x e a data de vencimento dela é 31/01/2011 por exemplo, eu faço um for no número de parcelas, vamos supor, 10 parcelas.

Ai faço:

for($i = 0; $i < $numeroParcelas; $i++) {
 $this->data[$i]['ContasReceber'] = $contas;
 $this->data[$i]['ContasReceber']['dataVencimento'] = date('d/m/Y',mktime(date('H'),date('m'),date('s'),$dataVencimento[1]+$i,$dataVencimento[0],$dataVencimento[2]));
 $this->data[$i]['ContasReceber']['valor'] = number_format($precoParcelado,2,',','.');
}

Ou seja eu somo $i no mês, para ele gerar as datas de vencimento para 28/02/2011, 31/03/2011, 30/04/2011.

Acontece que ele soma sempre 31 dias, então quando vai nesses meses, ele poe os vencimentos para 02/03/2011 invés de 28/02/2011 e pra 01/05/2011 invés de 30/04/2011.

Alguém sabe como resolve isso?

#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 05/05/2011, 20:37

Use a classe DateTime. Bem mais apropriado. Em particular, esse método:

http://www.php.net/m...atetime.add.php

Veja os exemplos.

#3 kleryson

kleryson

    Mestre

  • Usuários
  • 687 posts
  • Sexo:Masculino

Posted 06/05/2011, 09:51

Criei uma função vê se isso te ajuda....

function pegardataPagamento($data,$quantosMeses){
	$dataPagamento = array();
	
	$dateCompare = $data;
	if ( strlen($dateCompare) == 10 && strlen(str_replace("-","",$dateCompare))==8 ){
		list($ano,$mes,$dia) = explode("-",$data);

		for ( $i = 0 ; $i < $quantosMeses; $i++){		
			$mesProce = str_pad($mes + $i,2,'0',STR_PAD_LEFT);
							
			$lastdate = date("t",mktime(0,0,0,$mesProce,1,$ano));
					
			if ($dia > $lastdate){
				$dataPagamento[]= date("Y-m-d",mktime(0,0,0,$mesProce,$lastdate,$ano));
			}else{
				$dataPagamento[]= date("Y-m-d",mktime(0,0,0,$mesProce,$dia,$ano));
			}
		}
		
	}else{
		echo "Formato inválido";
	}	
	
	return $dataPagamento;
}

$retorno = pegardataPagamento('2011-01-31',5);

echo "<pre>";
print_r($retorno);
echo "</pre>";


(y)??

#4 fekz

fekz

    12 Horas

  • Usuários
  • 243 posts
  • Sexo:Não informado

Posted 10/05/2011, 11:50

Use a classe DateTime. Bem mais apropriado. Em particular, esse método:

http://www.php.net/m...atetime.add.php

Veja os exemplos.


Essa função não adianta, quando somo 1 mes, ele vai pra março do mesmo jeito.

Criei uma função vê se isso te ajuda....

function pegardataPagamento($data,$quantosMeses){
	$dataPagamento = array();
	
	$dateCompare = $data;
	if ( strlen($dateCompare) == 10 && strlen(str_replace("-","",$dateCompare))==8 ){
		list($ano,$mes,$dia) = explode("-",$data);

		for ( $i = 0 ; $i < $quantosMeses; $i++){		
			$mesProce = str_pad($mes + $i,2,'0',STR_PAD_LEFT);
							
			$lastdate = date("t",mktime(0,0,0,$mesProce,1,$ano));
					
			if ($dia > $lastdate){
				$dataPagamento[]= date("Y-m-d",mktime(0,0,0,$mesProce,$lastdate,$ano));
			}else{
				$dataPagamento[]= date("Y-m-d",mktime(0,0,0,$mesProce,$dia,$ano));
			}
		}
		
	}else{
		echo "Formato inválido";
	}	
	
	return $dataPagamento;
}

$retorno = pegardataPagamento('2011-01-31',5);

echo "<pre>";
print_r($retorno);
echo "</pre>";


(y)??


Perfeito. Muito bom a função =]




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq