+2

Trabalhando com datas em PHP

criado por Alex Florentino em 25/10/2003 10:25pm
Sintaxe da Função date:

string = date(string formato,int [data e hora em timestamp]);

no primeiro parâmetro string formato existe as seguintes opções :

d = dia no formato numérico de ex: "01" a "31".
D = as 03 letras do dia textual ex: "fri"

F = mês textual ex: "january"
m = mês no formato "00" a "12"

Y = no no formato 2003
y = ano no formato 03

h = hora no formato "00" a "12"
H = hora no formato de "00" a "23"

i = minutos

s = segundos

Apartir destes dados você poderá facilmente mostrar a data e hora atual da seguinte forma:

<?php
Echo "hora atual date('d-m-Y h:i')";
?>

Bom isto você mostra a data e hora atual mas se você por exemplo precisar trabalhar com uma data que não seja atual a passagem do segundo parametro se faz necessaria sendo que este parâmetro tem que ser no formato timestamp que nada mais é do que a quantidade de segundos passados desde meia-noite de 1970.
O PHP tem algumas funções de gerar timestamp para nós uma delas é time().

Sintaxe : int time();

Isto que dará o número de segundos passados 1970 até o momento atual.

Outra função para gerar o timestamp é o mktime();

Sintaxe : int mktime(int hora,int minuto,int segundo,int mês,int dia ,int ano);

Exemplo
<?php
$dia = 25;
$mês = 12;
$ano = 2003;
$ts= mktime($hora,$min,$seg,$mês,$dia,$ano);
echo $ts; // isto gerou o time timestamp
date ('d-m-Y',$ts); // isso deverar imprimir 25-12-2003.
?>

Bom agora que já conhecemos todas as funções, vamos a um pequeno exemplo pratico:

<?php
echo "Data e Hora : ".date('d-m-Y H:i');

$dia = 25 ; // pega o dia de natal
$mes = 12 ; // pega  o mes
$ano = date('y'); // o ano

$dia_atual = date('d'); // pega dia atual
$mes_atual = date('m'); // pega o mes atual

$ts = mktime($hora,$min,$seg,$mes - $mes_atual,$dia - $dia_atual,$ano);
echo "Falta ".date('m',$ts)." meses"." e ".date('d',$ts)." dias"." para o natal"." , Boas Compras hohoho...";

// Bom isto foi a subtração. agora vamos imaginar que estamos construindo uma loja virtual
// e determinado produto ou serviço pode ser pago em três parcelas, ou seja, 30,60,90 dias 
// e vc precisa gerar os boletos com as repectivas datas.

$dia_da_compra = date('d');
$mes_da_compra = date('m');
$ano_da_compra = date('Y');
$parcela = 30; // primeira parcela daqui a 30 dias

for ($cont = 1 ; $cont <= 3; $cont++) {
    $ts = mktime($hora,$min,$seg,$mes_da_compra,$dia_da_compra + $parcela,$ano);
    echo "Data de Pagamento da $cont °  parcela : ".date('d-m-Y',$ts)."<br>";
    $parcela = $parcela + 30;
} 
?>

Comentários:

Mostrando 1 - 9 de 9 comentários
Pois os carnês de pagamento são gerados sempre para o mesmo dia do mes...

aqui vai um algoritmo para vc gerar essas datas... blz
ta em delphi.. mas a lógica é simples



a variavel (a) seria a data do primeiro pagamento!!!
e depois é so chamar a função dentro de um loop contendo a quantidade de pagamentos!

function datavencimento(a:tdate):string;
var
d,m,y:word;
begin
decodedate (a,y,m,d);
inc(m);
if m>12 then
begin
m:=1;
inc(y);
end;
datavencimento:=ds+'/'+ms+'/'+currtostr(y);
end;
06/07/2006 1:09pm (~10 anos atrás)

Olá Show..

Pelo que eu sei todas as formas de negócio, tanto no comércio como no mercado de ações, é tudo 30 dias..

Para a parte comercial não existe 31 dias nem 28 ou 29 somente 30 dias.. por isso o sistema vai pegar 30 dias.

Acho que é isso se estiver errado por favor me corrijam.

Abraços

Doniani
22/02/2006 3:24pm (~10 anos atrás)

Amigo, este script é perfeito..
Minha única dúvida é no trecho abaixo:

$dia_da_compra = date('d');
$mes_da_compra = date('m');
$ano_da_compra = date('Y');
$parcela = 30; // primeira parcela daqui a 30 dias

for ($cont = 1 ; $cont <= 3; $cont++) {
$ts = mktime($hora,$min,$seg,$mes_da_compra,$dia_da_compra + $parcela,$ano);
echo "Data de Pagamento da $cont ° parcela : ".date('d-m-Y',$ts)."<br>";
$parcela = $parcela + 30;
}
?>

Funciona certinho o único problema é que ele não gera as futuras faturas com intervalo de 30, 31 dias ou seja mes 31 ele considera como 30 e sempre vai caindo um dia por mes!
Como considerar isto e também o mes de fevereiro que pode ser 28 ou 29 dias! Exemplo eu quero todas as futuras faturas no dia 1 de cada mes!
16/01/2006 4:03pm (~11 anos atrás)

E tem gente que ainda não acha valor na internet...Resolveu minha vida esse script!!!
05/10/2005 4:09pm (~11 anos atrás)

alex rocha disse:
Colocando a data no formato para insercao no banco interbase/firebird/mysql:



Resolvido:


Com ajuda dos amigos:

Primeiro eu pego a data do form chamo a funcao converteData que transformará para data do banco interbase assim como: 2004-Nov-28

agora quando o usario entra com a data no form 28/11/2004 a funcao transforma na data para o banco interbase ou firebird e mysql, armazenando realmente a data digitada no form 28/11/2004.
antes ele invertia na hora de inserir no banco ficando 11/28/2004 só que nem chegava de armazenar dava um erro.

sigua os passos abaixo:

<?

$thisDATANASCIMENTO = converteData($thisDATANASCIMENTO);


function converteData($data){
if ($data == "")
return "";

if (substr($data,3,2) == "01"){
$mes = "Jan";
};
if (substr($data,3,2) == "02"){
$mes = "Feb";
};
if (substr($data,3,2) == "03"){
$mes = "Mar";
};
if (substr($data,3,2) == "04"){
$mes = "Apr";
};
if (substr($data,3,2) == "05"){
$mes = "May";
};
if (substr($data,3,2) == "06"){
$mes = "Jun";
};
if (substr($data,3,2) == "07"){
$mes = "Jul";
};
if (substr($data,3,2) == "08"){
$mes = "Aug";
};
if (substr($data,3,2) == "09"){
$mes = "Sep";
};
if (substr($data,3,2) == "10"){
$mes = "Oct";
};
if (substr($data,3,2) == "11"){
$mes = "Nov";
};
if (substr($data,3,2) == "12"){
$mes = "Dec";
};

$diavenc = substr($data,0,2);
$mesvenc = $mes;
$anovenc = substr($data,6,4);


$dataConvertida = $anovenc."-".$mesvenc."-".$diavenc;
return $dataConvertida;


}


?>
07/12/2004 8:59am (~12 anos atrás)

Rogério disse:
Segundo manual do php e várias outras referências pela web, seria possível obter os nomes dos dias da semana e dos meses em Português, ajustando o setlocale. Pelo0 q pesquisei, bastaria usar: setlocale(LC_ALL,"pt_BR"); //Linux
ou
setlocale(LC_CTYPE,"Portuguese Brazil");//Windows
Então nos comandos de data, onde a formatação fosse 'D' ou 'F', teríamos os nomes em Português.
Testei das 2 formas aqui no WinXP+Apache+PHP3.2, mas não consegui fazer funcionar. Algúem sabe o caminho das pedras?
01/12/2003 12:21am (~13 anos atrás)

Obrigado, sua observação esta correta. deve ter sido algum problema na hora da formatação do texto pois tb não é Echo e sim echo.sempre lembrando que o php é case sensitive por isso echo != Echo.Bom espero que estes problemas não esteja causando grandes dificuldade mais qualquer duvida sobre este artigo pode entrar em contato comigo.
01/11/2003 8:39pm (~13 anos atrás)

Como o Diogo disse esse tipo de artigo é muito importante.
mas o meu comentário é sobre o seguinte ..

<?php
Echo "hora atual date('d-m-Y h:i')";
?>

a funcao deve esta fora das aspas pra ser reconhecida como função. ai vai uma sugestão ;)

<?php
echo "hora atual: ".date("d-m-Y h:i");
?>

como sabemos o " . " ponto é o operador dse concatenacao.
01/11/2003 8:28pm (~13 anos atrás)

Diogo Gomes disse:
Artigos como esse são importantes por apresentarem aos mais iniciantes as facilidades, alé de desintupirem os fóruns com perguntas repetitivas, que poderiam ser resolvidas com um pesquisar. Mas é assim mesm, eu também já fui um iniciante, ainda sou, mas já iniciado, hehehe.
28/10/2003 6:55pm (~13 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)