1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
5 -------------------------------------------------------------------------------
6 This file is part of meconlib.
8 meconlib is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2 of the License, or (at your option)
13 meconlib is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License; if not,
18 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA 02111-1307 USA
20 -------------------------------------------------------------------------------
21 Creado: lun abr 22 16:05:33 ART 2002
22 Autor: Gonzalo Merayo <gmeray@mecon.gov.ar>
23 -------------------------------------------------------------------------------
25 -----------------------------------------------------------------------------*/
27 require_once 'MECON/Tiempo/Hora.php';
30 * Representa un Intervalo entre 2 horas del mismo dia
34 * @author Gonzalo Merayo <gmeray@mecon.gov.ar>
36 class MECON_Tiempo_Intervalo {
39 * Hora de inicio del intervalo
47 * Hora de fin del intervalo
56 * @param Hora $inicio Hora de inicio (por defecto cero).
57 * @param Hora $fin Hora de fin (por defecto cero).
58 * @param bool $chequear Invierte el intervalo si la hora de
59 * fin es anterior a la de inicio.
62 function MECON_Tiempo_Intervalo($inicio = null, $fin = null, $chequear = true)
65 $inicio = new MECON_Tiempo_Hora;
68 $fin = new MECON_Tiempo_Hora;
70 $this->inicio = $inicio;
80 if($a->lower($this->inicio)) {
82 $this->fin = $this->inicio;
89 return $this->fin->lower($this->inicio);
92 function setInicio($inicio) {
93 $this->inicio = $inicio;
104 function setFin($fin)
110 function getDuracion()
112 $c = new MECON_Tiempo_Hora;
113 $c->copy($this->fin);
114 $c->subtract($this->inicio);
119 * Chequea si el intervalo se superpone con otros.
120 * @param $intervalos Intervalo o array de Intervalo con los cuales chequear.
121 * @return true si se superpone con uno o más intervalos.
123 function seSuperpone($intervalos)
125 if (!is_array($intervalos)) {
126 $intervalos = array($intervalos);
128 foreach ($intervalos as $i) {
129 if ($i->fin->greater($this->inicio) && $this->fin->greater($i->inicio)) {
132 if ($this->fin->greater($i->inicio) && $i->fin->greater($this->inicio)) {
140 * Chequea si el intervalo es adyacente a otro.
144 * |-----------|------------| Adyacentes
147 * |-----------| |--------| No adyacentes
149 * @param $intervalo Intervalo con el cual chequear.
150 * @return true si se son adyacentes.
152 function esAdyacente($intervalo)
154 if ($intervalo->fin->equal($this->inicio) || $this->fin->equal($intervalo->inicio)) {
160 function fusionar($i)
162 if (!$this->seSuperpone($i) && !$this->esAdyacente($i)) {
165 if ($i->fin->greater($this->fin)) {
166 $this->fin = $i->fin;
168 if ($i->inicio->lower($this->inicio)) {
169 $this->inicio = $i->inicio;
174 function superponer($i)
176 $inicio = $this->inicio;
178 if ($this->inicio->lower($i->inicio)) {
179 $inicio = $i->inicio;
181 if ($this->fin->greater($i->fin)) {
184 $fin->subtract($inicio);
189 * Corta un intervalo, devolviendo el intervalo previo al punto de corte.
190 * El intervalo actual queda con el intervalo posterior al punto de corte.
191 * El punto de corte puede ser tanto una hora como un intervalo.
193 * @param mixed $c Donde cortar.
195 * @return object Intervalo Intervalo anterior al punto de corte.
199 if(is_a($c, 'mecon_tiempo_hora')) {
200 return $this->cortarHora($c);
201 } elseif (is_a($c, 'mecon_tiempo_intervalo')) {
202 return $this->cortarIntervalo($c);
209 * Corta un intervalo, devolviendo el intervalo previo a la hora de corte.
210 * El intervalo actual queda con el intervalo posterior a la hora de corte.
212 * @param mixed $h Donde cortar.
214 * @return object Intervalo Intervalo anterior a la hora de corte.
216 function cortarHora($h)
218 $class = get_class($this);
221 if($this->inicio->greater($h)) {
222 $r->setFin($r->inicio);
225 if($this->fin->lowerEqual($h)) {
226 $this->setInicio($this->fin);
228 $this->setInicio($h);
235 * Corta un intervalo, devolviendo el intervalo previo al intervalo de corte.
236 * El intervalo actual queda con el intervalo posterior al intervalo de corte.
238 * @param mixed $i Donde cortar.
240 * @return object Intervalo Intervalo anterior al intervalo de corte.
242 function cortarIntervalo($i)
244 $ant = $this->cortarHora($i->inicio);
245 $this->cortarHora($i->fin);
249 function toString() {
250 return 'inicio: ' . $this->inicio->format() . ' | fin: ' . $this->fin->format();
255 $this->inicio = $i->inicio->__clone();
256 $this->fin = $i->fin->__clone();
262 $class = get_class($this);