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 ) {
64 $inicio = new MECON_Tiempo_Hora;
66 $fin = new MECON_Tiempo_Hora;
67 if(!is_a($inicio, 'mecon_tiempo_hora'))
69 if(!is_a($fin, 'mecon_tiempo_hora'))
71 $this->inicio = $inicio;
78 function _chequear() {
80 if($a->lower($this->inicio)) {
82 $this->fin = $this->inicio;
87 function invertido() {
88 return $this->fin->lower($this->inicio);
91 function setInicio( $inicio ) {
92 if(! is_a($inicio, 'mecon_tiempo_hora'))
94 $this->inicio = $inicio;
105 function setFin( $fin ) {
106 if(! is_a($fin,'mecon_tiempo_hora'))
112 function getDuracion() {
113 $c = new MECON_Tiempo_Hora;
114 $c->copy($this->fin);
115 $c->subtract($this->inicio);
119 // XXX - Amplié el método para comparar con varios intervalos a la vez,
120 // si el argumento no es un array, anda de todas maneras.
121 function seSuperpone( $intervalos ) {
122 if (!is_array($intervalos))
123 $intervalos = array($intervalos);
124 foreach ($intervalos as $i) {
125 if (is_a($i, 'mecon_tiempo_intervalo')) {
126 if ($i->fin->greaterEqual($this->inicio) &&
127 $this->fin->greaterEqual($i->inicio))
129 if ($this->fin->greaterEqual($i->inicio) &&
130 $i->fin->greaterEqual($this->inicio))
137 function fusionar( $f ) {
138 if(! is_a($f, 'mecon_tiempo_intervalo'))
140 if(! $this->seSuperpone( $f ))
142 if($f->fin->greater($this->fin))
143 $this->fin = $f->fin;
144 if($f->inicio->lower($this->inicio))
145 $this->inicio = $f->inicio;
149 function superponer( $i ) {
150 if(! is_a($i, 'mecon_tiempo_intervalo'))
152 $inicio = $this->inicio;
154 if($this->inicio->lower($i->inicio))
155 $inicio = $i->inicio;
156 if($this->fin->greater( $i->fin ))
158 $fin->subtract($inicio);
163 * Corta un intervalo, devolviendo el intervalo previo al punto de corte.
164 * El intervalo actual queda con el intervalo posterior al punto de corte.
165 * El punto de corte puede ser tanto una hora como un intervalo.
167 * @param mixed $c Donde cortar.
169 * @return object Intervalo Intervalo anterior al punto de corte.
171 function cortar($c) {
172 if(is_a($c, 'mecon_tiempo_hora')) {
173 return $this->cortarHora($c);
175 elseif (is_a($c, 'mecon_tiempo_intervalo')) {
176 return $this->cortarIntervalo($c);
184 * Corta un intervalo, devolviendo el intervalo previo a la hora de corte.
185 * El intervalo actual queda con el intervalo posterior a la hora de corte.
187 * @param mixed $h Donde cortar.
189 * @return object Intervalo Intervalo anterior a la hora de corte.
191 function cortarHora($h) {
192 if (!is_a($h, 'mecon_tiempo_hora'))
194 $class = get_class($this);
197 if($this->inicio->greater($h)) {
198 $r->setFin($r->inicio);
201 if($this->fin->lowerEqual($h)) {
202 $this->setInicio($this->fin);
204 $this->setInicio($h);
211 * Corta un intervalo, devolviendo el intervalo previo al intervalo de corte.
212 * El intervalo actual queda con el intervalo posterior al intervalo de corte.
214 * @param mixed $i Donde cortar.
216 * @return object Intervalo Intervalo anterior al intervalo de corte.
218 function cortarIntervalo($i) {
219 if (!is_a($i, 'mecon_tiempo_intervalo'))
221 $ant = $this->cortarHora($i->inicio);
222 $this->cortarHora($i->fin);
226 function toString() {
227 return 'inicio: ' . $this->inicio->format() . ' | fin: ' . $this->fin->format();
230 function copy($int = null) {
231 if (!(is_a($int, 'mecon_tiempo_intervalo')))
233 $this->inicio = new MECON_Tiempo_Hora($int->inicio->get
235 $this->fin = new MECON_Tiempo_Hora($int->fin->get
241 $class = get_class($this);
243 $i->inicio = $this->inicio->__clone();
244 $i->fin = $this->fin->__clone();