1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License; if not,
17 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 Boston, MA 02111-1307 USA
19 -------------------------------------------------------------------------------
20 Creado: lun abr 22 16:05:33 ART 2002
21 Autor: Gonzalo Merayo <gmeray@mecon.gov.ar>
22 -------------------------------------------------------------------------------
24 -----------------------------------------------------------------------------*/
26 require_once 'MLIB/Tiempo/Hora.php';
29 * Representa un Intervalo entre 2 horas del mismo dia
33 * @author Gonzalo Merayo <gmeray@mecon.gov.ar>
35 class MLIB_Tiempo_Intervalo {
38 * Hora de inicio del intervalo
46 * Hora de fin del intervalo
55 * @param Hora $inicio Hora de inicio (por defecto cero).
56 * @param Hora $fin Hora de fin (por defecto cero).
57 * @param bool $chequear Invierte el intervalo si la hora de
58 * fin es anterior a la de inicio.
61 function MLIB_Tiempo_Intervalo($inicio = null, $fin = null, $chequear = true)
64 $inicio = new MLIB_Tiempo_Hora;
67 $fin = new MLIB_Tiempo_Hora;
69 $this->inicio = $inicio;
79 if($a->lower($this->inicio)) {
81 $this->fin = $this->inicio;
88 return $this->fin->lower($this->inicio);
91 function setInicio($inicio) {
92 $this->inicio = $inicio;
103 function setFin($fin)
109 function getDuracion()
111 $c = new MLIB_Tiempo_Hora;
112 $c->copy($this->fin);
113 $c->subtract($this->inicio);
118 * Chequea si el intervalo se superpone con otros.
119 * @param $intervalos Intervalo o array de Intervalo con los cuales chequear.
120 * @return true si se superpone con uno o más intervalos.
122 function seSuperpone($intervalos)
124 if (!is_array($intervalos)) {
125 $intervalos = array($intervalos);
127 foreach ($intervalos as $i) {
128 if ($i->fin->greater($this->inicio) && $this->fin->greater($i->inicio)) {
131 if ($this->fin->greater($i->inicio) && $i->fin->greater($this->inicio)) {
139 * Chequea si el intervalo es adyacente a otro.
143 * |-----------|------------| Adyacentes
146 * |-----------| |--------| No adyacentes
148 * @param $intervalo Intervalo con el cual chequear.
149 * @return true si se son adyacentes.
151 function esAdyacente($intervalo)
153 if ($intervalo->fin->equal($this->inicio) || $this->fin->equal($intervalo->inicio)) {
159 function fusionar($i)
161 if (!$this->seSuperpone($i) && !$this->esAdyacente($i)) {
164 if ($i->fin->greater($this->fin)) {
165 $this->fin = $i->fin;
167 if ($i->inicio->lower($this->inicio)) {
168 $this->inicio = $i->inicio;
173 function superponer($i)
175 $inicio = $this->inicio;
177 if ($this->inicio->lower($i->inicio)) {
178 $inicio = $i->inicio;
180 if ($this->fin->greater($i->fin)) {
183 $fin->subtract($inicio);
188 * Corta un intervalo, devolviendo el intervalo previo al punto de corte.
189 * El intervalo actual queda con el intervalo posterior al punto de corte.
190 * El punto de corte puede ser tanto una hora como un intervalo.
192 * @param mixed $c Donde cortar.
194 * @return object Intervalo Intervalo anterior al punto de corte.
198 if(is_a($c, 'MLIB_tiempo_hora')) {
199 return $this->cortarHora($c);
200 } elseif (is_a($c, 'MLIB_tiempo_intervalo')) {
201 return $this->cortarIntervalo($c);
208 * Corta un intervalo, devolviendo el intervalo previo a la hora de corte.
209 * El intervalo actual queda con el intervalo posterior a la hora de corte.
211 * @param mixed $h Donde cortar.
213 * @return object Intervalo Intervalo anterior a la hora de corte.
215 function cortarHora($h)
217 $class = get_class($this);
220 if($this->inicio->greater($h)) {
221 $r->setFin($r->inicio);
224 if($this->fin->lowerEqual($h)) {
225 $this->setInicio($this->fin);
227 $this->setInicio($h);
234 * Corta un intervalo, devolviendo el intervalo previo al intervalo de corte.
235 * El intervalo actual queda con el intervalo posterior al intervalo de corte.
237 * @param mixed $i Donde cortar.
239 * @return object Intervalo Intervalo anterior al intervalo de corte.
241 function cortarIntervalo($i)
243 $ant = $this->cortarHora($i->inicio);
244 $this->cortarHora($i->fin);
248 function toString() {
249 return 'inicio: ' . $this->inicio->format() . ' | fin: ' . $this->fin->format();
254 $this->inicio = $i->inicio->__clone();
255 $this->fin = $i->fin->__clone();
261 $class = get_class($this);