Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal eu criei uma classe de manipular datas onde ela: soma, subtrai, compara, tira a diferença, converte, valida etc...
mas vou postar aqui algumas partes porque fica mais facil para quem quer aprender, em vez de só usar a classe, entao vou postar aqui a função que soma a data
<?php
function valida_data($data)
{
$data = trim($data);
if(preg_match("@^\d{2}/\d{2}/\d{4}$@", $data)) {
$arr = explode("/", $data);
return !checkdate($arr[1], $arr[0], $arr[2]) ? false : true;
}
if(preg_match("@^\d{4}-\d{2}-\d{2}$@", $data)) {
$arr = explode("-", $data);
return !checkdate($arr[1], $arr[2], $arr[1]) ? false : true;
}
if(preg_match("@^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$@", $data)) {
$arr = explode("-", $data);
$dia = substr($arr[2], 0, 2);
return !checkdate($arr[1], $dia, $arr[0]) ? false : true;
}
return false;
}
function converter_data($data)
{
$data = trim($data);
if(preg_match("@^\d{4}-\d{2}-\d{2}$@", $data)) {
return $data;
}
if(preg_match("@^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$@", $data)) {
return $data;
}
if(preg_match("@^\d{2}/\d{2}/\d{4}$@", $data)) {
return implode("-", array_reverse(explode("/", $data)));
}
else {
echo "data invalida";
exit;
}
}
function soma_data($data, $add)
{
$add = trim($add);
$data = trim($data);
$data = preg_replace("#(agora|hoje|atual)#i", date("Y-m-d H:i:s"), $data);
$data = converter_data($data);
if(valida_data($data)) {
$add = preg_replace("#semana[s]?#i", "week", $add);
$add = preg_replace("#m(e|[ê])s(es)?#i", "month", $add);
$add = preg_replace("#ano[s]?#i", "year", $add);
$add = preg_replace("#dia[s]?#i", "days", $add);
$add = preg_replace("#hora[s]?#i", "hours", $add);
$add = preg_replace("#minuto[s]?#i", "minutes", $add);
$add = preg_replace("#segundo[s]?#i", "seconds", $add);
//$data = getdate(strtotime("$data +$add"));
setlocale(LC_TIME,"portuguese");
$data = strftime("%A %B %Y %c %j", strtotime("$data +$add"));
$arr = explode(" ", $data);
$datas["semana"] = $arr[0];
$arr2 = explode("/", $arr[3]);
$dia = $arr2[0];
$mes = $arr2[1];
$ano = $arr2[2];
$datas["dia"] = sprintf("%02d", $dia);
$datas["mes"][1] = $arr[1];
$datas["mes"][2] = sprintf("%02d", $mes);
$datas["ano"] = $ano;
$arr3 = explode(":", $arr[4]);
$datas["hora"] = $arr3[0];
$datas["minuto"] = $arr3[1];
$datas["segundo"] = $arr3[2];
$datas["dia_ano"] = $arr[5];
return $datas;
} else {
echo "Data invalida";
}
}
print_r(soma_data("2006-02-15 18:28:14", "5 minutos"));
?>
Resultado um array contendo as data e hora no padrao brasileiro
resultado:
Array
(
[semana] => quarta-feira
[dia] => 15
[mes] => Array
(
[1] => fevereiro // mes escrito
[2] => 02 // mes numerico
)
[ano] => 2006
[hora] => 18
[minuto] => 33
[segundo] => 14
[dia_ano] => 046 // numero de dias que se passaram de janeiro ate a data
)
MODO DE USAR:
é bem simples eu passei para o portugues assim é facil você querer somar a data só passar o que você quer exemplos de uso:
obs: pode digitar tanto maiusculas e minusculas no plural ou no singular a função é um pouco inteligente :D
tanto faz passar a data 00/00/0000 ou 0000-00-00 da na mesma
print_r(soma_data("2006-02-15 18:28:14", "5 minutos"));
print_r(soma_data("2006-02-15 18:28:14", "1 dia"));
print_r(soma_data("2006-02-15 18:28:14", "28 dias"));
print_r(soma_data("2006-02-15 18:28:14", "10 semanas"));
print_r(soma_data("2006-02-15 18:28:14", "1 mes"));
print_r(soma_data("2006-02-15 18:28:14", "6 horas"));
print_r(soma_data("2006-02-15 18:28:14", "3600 segundos"));
print_r(soma_data("2006-02-15 18:28:14", "1 ano"));
// percebam os espaços abaixo depois de "dias" caso acidentalmente alguem de um espaço por engano o sistema vai entender normalmente
print_r(soma_data("2006-02-15 18:28:14", "5 dias "));
print_r(soma_data("2006-02-15 18:28:14", " 3 dias "));
data atual percebam "agora", "hoje", "atual"
print_r(soma_data("agora", "3 dias"));
print_r(soma_data("hoje", "2 segundos"));
print_r(soma_data("atual", "3 meses"));
dai com o resultado num array nao precisa nem falar né?, é só você pegar e montar a saida da data do jeito que precisar pode usar ucfirst() para deixar mais apresentavel o dia da semana etc..., assim você tem um leque de possibilidades
bom ta ai usem a vontade e em caso de duvidas sobre o script só postar
e quem quiser melhorar ou criticar fiquem a vontade tbm
Fabão matou tudo com uma tacada só muito boa mesmo...
Uma imagem vale mais do mil palavras ....
:blink: http://forum.imasters.com.br/public/style_emoticons/default/graduated.gif :huh: :mellow: :o http://forum.imasters.com.br/public/style_emoticons/default/graduated.gif
Parabéns.
http://forum.imasters.com.br/public/style_emoticons/default/clap.gif
Sem comentários..
Excelente, mesmo... ótimo trabalho! :worship:
na boa caratu pavoro nessa agora em fabyoauiauuaui
Muito bom esse scrpt, era isso que estava procurando. Mas desculpe-me novamente a ignorancia. está ocorrendo o seguinte erro:
----------------------------------------------------------------------------------------------------
Notice: Undefined offset: 1 in /var/www/html/login/soma_data.php on line 64
Notice: Undefined offset: 2 in /var/www/html/login/soma_data.php on line 65
Notice: Undefined offset: 1 in /var/www/html/login/soma_data.php on line 72
Notice: Undefined offset: 2 in /var/www/html/login/soma_data.php on line 73
Array ( [semana] => Sexta [dia] => 00 [mes] => Array ( [1] => Dezembro [2] => 00 ) [ano] => [hora] => 15 [minuto] => [segundo] => [dia_ano] => Dez )
--------------------------------------------------------------------------------------------------------
Não sei como resolver http://forum.imasters.com.br/public/style_emoticons/default/natal_sad.gif
Cara esse script fico espetacular!Muito mais prático agora...Cada script melhor que o outro hein??Abraço!
oi fabyo belezagente boa estou com um problema para pegar a data atual:
> else { $data_limit = print_r(soma_data($inicio, "3 dias")); if($data_limit >= date()){ // dá um erro e um notice nesta linha e exibe um arry echo'<li><img src="banners/banner_reservado.png" alt="Banner Anuncio com espaço reservado"" /></li>'; }
> Notice: Undefined index: banner in C:\Apache\www\abrace\index.php on line 417Array ( [semana] => sábado [dia] => 19 [mes] => Array ( [1] => maio [2] => 05 ) [ano] => 2007 [hora] => 00 [minuto] => 00 [segundo] => 00 [dia_ano] => 139 ) Warning: date() expects at least 1 parameter, 0 given in C:\Apache\www\abrace\index.php on line 443
como faço para pegar a data atual e evitar estes erros.desde ja obrigado
Galera dei uma melhorada ai no codigo, na verdade arrumei pra aparecer tudo certim e mudei algumas coisa, o codigo vai abaixo
>
<?php
function valida_data($data)
{
$data = trim($data);
if(preg_match("@^\d{2}/\d{2}/\d{4}$@", $data)) {
$arr = explode("/", $data);
return !checkdate($arr[1], $arr[0], $arr[2]) ? false : true;
}
if(preg_match("@^\d{4}-\d{2}-\d{2}$@", $data)) {
$arr = explode("-", $data);
return !checkdate($arr[1], $arr[2], $arr[1]) ? false : true;
}
if(preg_match("@^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$@", $data)) {
$arr = explode("-", $data);
$dia = substr($arr[2], 0, 2);
return !checkdate($arr[1], $dia, $arr[0]) ? false : true;
}
return false;
}
function converter_data($data)
{
$data = trim($data);
if(preg_match("@^\d{4}-\d{2}-\d{2}$@", $data)) {
return $data;
}
if(preg_match("@^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$@", $data)) {
return $data;
}
if(preg_match("@^\d{2}/\d{2}/\d{4}$@", $data)) {
return implode("-", array_reverse(explode("/", $data)));
}
else {
echo "data invalida";
exit;
}
}
function soma_data($data, $add)
{
$add = trim($add);
$data = trim($data);
$data = preg_replace("#(agora|hoje|atual)#i", date("Y-m-d H:i:s"), $data);
$data = converter_data($data);
if(valida_data($data)) {
$add = preg_replace("#semana?#i", "week", $add);
$add = preg_replace("#m(e|[ê])s(es)?#i", "month", $add);
$add = preg_replace("#ano?#i", "year", $add);
$add = preg_replace("#dia?#i", "days", $add);
$add = preg_replace("#hora?#i", "hours", $add);
$add = preg_replace("#minuto?#i", "minutes", $add);
$add = preg_replace("#segundo?#i", "seconds", $add);
//$data = getdate(strtotime("$data +$add"));
setlocale(LC_TIME,"portuguese");
$data = strftime("%A %B %Y %c %j", strtotime("$data +$add"));
$arr = explode(" ", $data);
$dia = $arr[4];
$mes = $arr[1];
$ano = $arr[6];
if($arr[0] == "Sábado" || $arr[0] == "Domingo")
{
$datas["semana"] = $arr[0];
}
else //dia escrito
{
$datas["semana"] = $arr[0] ." - feira";
}
$datas["dia"] = sprintf("%02d", $dia); //dia numero
$datas["mounth"] = $arr[1]; //mes escrito
switch($datas["mounth"]) { //mes numero
case Janeiro:
$datas["mes"] = "01"; break;
case Fevereiro:
$datas["mes"] = "02"; break;
case Março:
$datas["mes"] = "03"; break;
case Abril:
$datas["mes"] = "04"; break;
case Maio:
$datas["mes"] = "05"; break;
case Junho:
$datas["mes"] = "06"; break;
case Julho:
$datas["mes"] = "07"; break;
case Agosto:
$datas["mes"] = "08"; break;
case Setembro:
$datas["mes"] = "09"; break;
case Outubro:
$datas["mes"] = "10"; break;
case Novembro:
$datas["mes"] = "11"; break;
case Dezembro:
$datas["mes"] = "12"; break;
}
$datas["ano"] = $ano; //ano
$arr2 = explode(":", $arr[7]); //divide as horas
$datas["hora"] = $arr2[0]; //hora
$datas["minuto"] = $arr2[1]; //minuto
$datas["segundo"] = $arr2[2]; //Segundo
$datas["dia_ano"] = $arr[9]; //anos a partir do começo do ano
return $datas;
} else {
echo "Data invalida";
}
}
print_r(soma_data("2007-01-23 18:28:14", "10 dia"));
?>
Ai é so pegar os arrays e pronto, funfa de boa e manipula do jeito que quiser, Qualquer coisa tamo ai
MUito bom.. tava precisando de um trem desses a algum tempo... jaja irei utiliza-la.. vlw.. como sempre... so scripts da hora