Palavra:   

Revista PHP / PHP

Andre Pedroso

http://apedroso.blogspot.com

Manipular e Calcular data e hora

Introdução

Quando comecei estudar PHP encontrei logo um problema para manipular data e hora e para aprender a trabalhar com esses dados eu desenvolvi uma classe com vários métodos que facilitam a manipulação dessas informações. Apesar de ser uma classe bem útil, ela foi desenvolvida com o intuito de aprendizagem, logo tem muitas coisas a serem melhoradas para que ela possa ser
devidamente reaproveitada, para tal conto com a colaboração de todos.

Métodos disponíveis

É possível executar operações de soma e subtração de datas e horas através dos métodos somaAno(valor), somaMes(valor), somaDia(valor), somaHora(valor), somaMinuto(valor), somaSegundo() e basta passar um valor negativo para subtração. Podese
calcular também a diferença entre duas datas e horas com o método difDataHora(datamenor, datamaior, tipo), sendo possível
definir o retorno em dias, horas, minutos e segundos.

É importante destacar que, por enquanto, existem somente dois tipos de padrões de data e hora:
“15/01/2007 10:30:00” (dh) e “15/01/2007” (d). Se ao instanciar o objeto não for informado uma data e hora ele assumira a data e hora atuais do servidor.

Como utilizar a classe

Instanciando o objeto:
PHP
  1. $obj = new CalcDataHora();
www.revistaphp.com.br
Imprimindo data e hora atual:
PHP
  1. echo $obj->getData()." - ".$obj->getHora(
www.revistaphp.com.br
Incrementando data:
PHP
  1. $obj->somaDia(5);
www.revistaphp.com.br
Decrementando data:
PHP
  1. $obj->somaMes(-5);
www.revistaphp.com.br
Calculando diferença entre duas datas:
PHP
  1. echo $obj->difDataHora("10/10/2006 10:10:00", "11/10/2006 10:10:00","h");
www.revistaphp.com.br
*Acho que isso já é o suficiente para começar a brincar com a classe (anexo 1).

Anexo 1 (Classe completa)

PHP
  1. <?php
  2. // *
  3. // * @author Andre Lourenco Pedroso - alp.pedroso@gmail.com
  4. // *
  5. // * @date 15 de Janeiro de 2007
  6. // *
  7.  
  8. /**
  9. *
  10. * - Manipulacao de Data ou Hora.
  11. *
  12. * Operacoes: soma DIA, MES ,ANO, HORA, MINUTOS, SEGUNDOS.
  13. * Formatos :
  14. * Data: 15/01/2007
  15. * Hora: 10:35:00
  16. * Para subtrair, basta passar um valor negativo:
  17. * Ex:
  18. * $obj->somaDia(-10);
  19. *
  20. * - Calcula diferenca entre duas datas.
  21. *
  22. * Operacoes: difDataHora.
  23. * Formatos :
  24. * Data: 15/01/2007 10:35:00
  25. * E necessario passar duas datas como parametro e o tipo de retorno desejado:
  26. * Ex:
  27. * $obj->difDataHora($dataMenor,$dataMaior,"m");
  28. *
  29. */
  30. class CalcDataHora
  31. {
  32. private $data;
  33. private $hora;
  34.  
  35. function CalcDataHora($data="",$hora="")
  36. {
  37. if($hora=="")
  38. {
  39. $hora = date("H:i:s");
  40. }
  41. if($data=="")
  42. {
  43. $data = date("d/m/Y ");
  44. }
  45. else if ($this->validaData($data,"d"))
  46. {
  47. die ("Padrao de data ($data) invalido! - Padrao = 15/01/2007");
  48. }
  49. $this->data = explode("/",$data);
  50. $this->hora = explode(":",$hora);
  51. }
  52. private function validaData($data,$op)
  53. {
  54. switch($op)
  55. {
  56. case "d": // Padrao: 15/01/2007
  57. $er = "(([0][1-9]|[1-2][0-9]|[3][0-1])\/([0][1-9]|[1][0-2])\/([0-9]{4}))";
  58. if(ereg($er,$data))
  59. {
  60. return 0;
  61. }
  62. else
  63. {
  64. return 1;
  65. }
  66. break;
  67. case "dh": // Padrao 15/01/2007 10:30:00
  68. $er = "(([0][1-9]|[1-2][0-9]|[3][0-1])\/([0][1-9]|[1][0-2])\/([0-9]{4})*)";
  69. if(ereg($er,$data))
  70. {
  71. return 0;
  72. }
  73. else
  74. {
  75. return 1;
  76. }
  77. break;
  78. }
  79. }
  80. // DATA
  81. public function somaDia($dias=1)
  82. {
  83. $this->CalcDataHora(strftime("%d/%m/%Y", mktime(0, 0, 0, $this->data[1], $this->data[0]+$dias, $this->data[2])),"");
  84. return $this->data;
  85. }
  86. public function somaMes($meses=1)
  87. {
  88. $this->CalcDataHora(strftime("%d/%m/%Y", mktime(0, 0, 0, $this->data[1]+$meses, $this->data[0], $this->data[2])),"");
  89. return $this->data;
  90. }
  91. public function somaAno($anos=1)
  92. {
  93. $this->CalcDataHora(strftime("%d/%m/%Y", mktime (0, 0, 0, $this->data[1], $this->data[0], $this->data[2]+$anos)),"");
  94. return $this->data;
  95. }
  96. public function getData()
  97. {
  98. return $this->data[0]."/".$this->data[1]."/".$this->data[2];
  99. }
  100. // HORA
  101. public function somaSegundo($segundos=1)
  102. {
  103. $this->CalcDataHora("",strftime("%H:%M:%S",mktime($this->hora[0],$this->hora[1],$this->hora[2]+$segundos, 0, 0, 0)));
  104. return $this->hora;
  105. }
  106. public function somaMinuto($minutos=1)
  107. {
  108. $this->CalcDataHora("",strftime("%H:%M:%S",mktime($this->hora[0],$this->hora[1]+$minutos,$this->hora[2], 0, 0, 0)));
  109. return $this->hora;
  110. }
  111. public function somaHora($horas=1)
  112. {
  113. $this->CalcDataHora("",strftime("%H:%M:%S",mktime($this->hora[0]+$horas,$this->hora[1],$this->hora[2], 0, 0, 0)));
  114. return $this->hora;
  115. }
  116. public function getHora()
  117. {
  118. return $this->hora[0].":".$this->hora[1].":".$this->hora[2];
  119. }
  120.  
  121.  
  122. /**
  123. *
  124. * Retorna diferença entre as datas em Dias, Horas ou Minutos
  125. * Function difDataHora(data menor, [data maior],[dias horas minutos segundos])
  126. *
  127. * Formato 04/05/2006 12:00:00
  128. *
  129. * Chame a funcao com o valor NULL como 'data maior' para 'data maior' = data atual.
  130. *
  131. * Formatacao do retorno [dias horas minutos segundos]:
  132. *
  133. * "s": Segundos
  134. * "m": Minutos
  135. * "H": Horas
  136. * "h": Horas arredondada
  137. * "D": Dias
  138. * "d": Dias arredontados
  139. *
  140. * Original: Gambiarra.com.br Bozo@gambiarra.com.br
  141. *
  142. * Modificado: Andre Lourenco Pedroso alp.pedroso@gmail.com
  143. * Data 15/01/2007 10:00
  144. */
  145. public function difDataHora($datamenor,$datamaior="",$tipo="")
  146. {
  147. if($this->validaData($datamenor,"dh"))
  148. {
  149. die ("data errada - $datamenor");
  150. }
  151. if($datamaior==""){
  152. $datamaior = date("d/m/Y H:i:s");
  153. }
  154. if($tipo==""){
  155. $tipo = "h";
  156. }
  157. list ($diamenor, $mesmenor, $anomenor, $horamenor, $minutomenor, $segundomenor) = split("[/: ]",$datamenor);
  158. list ($diamaior, $mesmaior, $anomaior, $horamaior, $minutomaior, $segundomaior) = split("[/: ]",$datamaior);
  159.  
  160. $segundos = mktime($horamaior,$minutomaior,$segundomaior,$mesmaior,$diamaior, $anomaior)-mktime($horamenor,$minutomenor,$segundomenor,$mesmenor,$diamenor, $anomenor);
  161.  
  162. switch($tipo){
  163. case "s": // Segundo
  164. $diferenca = $segundos;
  165. break;
  166. case "m": // Minuto
  167. $diferenca = $segundos/60;
  168. break;
  169. case "H": // Hora
  170. $diferenca = $segundos/3600;
  171. break;
  172. case "h": // Hora Arredondada
  173. $diferenca = round($segundos/3600);
  174. break;
  175. case "D": // Dia
  176. $diferenca = $segundos/86400;
  177. break;
  178. case "d": // Dia Arredondado
  179. $diferenca = round($segundos/86400);
  180. break;
  181. }
  182. return $diferenca;
  183. }
  184. }
www.revistaphp.com.br

Pronto! Agora é só se divertir. :)

Opções de Interação

Comentários

Calcular data e hora
Por: Brunno, 12/05/2009   11:39:50
Gostaria de saber, utilizando ou não essa função como eu posso subtrair duas dastas tipo. 2009-03-23 08:28:29 - 2009-03-23 08:28:19 = 2009-03-23 08:28:10