Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Ejecicio clase Fecha

Estas en el tema de Ejecicio clase Fecha en el foro de PHP en Foros del Web. Buenas comunidad, tengo el siguiente enunciado. Cita: Crea una clase Fecha con atributos para el día, el mes y el año de la fecha. Incluye, ...
  #1 (permalink)  
Antiguo 11/11/2015, 21:31
Avatar de gonzaherrera77  
Fecha de Ingreso: noviembre-2015
Mensajes: 60
Antigüedad: 8 años, 6 meses
Puntos: 7
Ejecicio clase Fecha

Buenas comunidad, tengo el siguiente enunciado.
Cita:
Crea una clase Fecha con atributos para el día, el mes y el año de la fecha.
Incluye, al menos, los siguientes métodos:
  1. Constructor predeterminado con el 1-1-1900 como fecha por defecto.
  2. Constructor parametrizado con día, mes y año.
  3. leer() : pedirá al usuario el día (1 a 31), el mes (1 a 12) y el año (1900 a 2050).
  4. bisiesto() : indicará si el año de la fecha es bisiesto o no.
  5. diasMes(int) : devolverá el número de días del mes que se le indique (para el año de la fecha).
  6. valida() : comprobará si la fecha es correcta (entre el 1-1-1900 y el 31-12-2050); si el día no es correcto, lo pondrá a 1; si el mes no es correcto, lo pondrá a 1; y si el año no es correcto, lo pondrá a 1900. Será un método auxiliar (privado). Este método se llamará en el constructor parametrizado y en leer() .
  7. diasTranscurridos() : devolverá el número de días transcurridos desde el 1-1-1900 hasta la fecha.
  8. diaSemana() : devolverá el día de la semana de la fecha (0 para domingo, ..., 6 para sábado). El 1-1-1900 fue domingo.
  9. siguiente() : pasará al día siguiente.
  10. anterior() : pasará al día anterior.
Esta seria la clase

Código PHP:
Ver original
  1. <?php
  2. class Fecha {
  3.     private $day;
  4.     private $month;
  5.     private $year;
  6.    
  7.     public function __construct($day = 1, $month = 1, $year = 1900) {
  8.         $this->day = $day;
  9.         $this->month = $month;
  10.         $this->year = $year;
  11.     }
  12.    
  13.     public function leer($day, $month, $year) {
  14.         if($this->validarFecha($day, $month, $year)) {
  15.             $this->day = $day;
  16.             $this->month = $month;
  17.             $this->year = $year;
  18.         }
  19.         else {
  20.             echo 'La fecha no es valida!!!';
  21.         }
  22.     }
  23.    
  24.     private function validarFecha($day, $month, $year) {
  25.         if($day > 0 && $day < 32) {
  26.             $dayOk = true;
  27.         }
  28.         else {
  29.             $dayOk = false;
  30.         }
  31.        
  32.         if($month > 0 && $month < 13) {
  33.             $monthOk = true;
  34.         }
  35.         else {
  36.             $monthOk = false;
  37.         }
  38.        
  39.         if($year >= 1900 && $year <= 2050) {
  40.             $yearOk = true;
  41.         }
  42.         else {
  43.             $yearOk = false;
  44.         }
  45.        
  46.         if($dayOk && $monthOk && $yearOk) {
  47.              return true;
  48.         }
  49.         else {
  50.             return false;
  51.         }
  52.     }
  53.    
  54.     public function esBisiesto() {
  55.         if($this->year % 4 == 0  && ($this->year % 100 != 0 || $this->year % 400 == 0)) {
  56.             echo 'Es Bisiesto<br />';
  57.         }
  58.         else {
  59.             echo 'No es Bisiesto<br />';
  60.         }
  61.     }
  62.    
  63.     public function diaMes($month) {
  64.         $fecha = "$this->day-$month-$this->year";
  65.         $timestamp = strtotime($fecha);
  66.         $diaMes = date('t', $timestamp);
  67.         echo 'El mes '.$month.'  tiene '.$diaMes.' dia/s';
  68.     }
  69.    
  70.     public function diasTranscurridos() {
  71.      
  72.        $diasDefault = gregoriantojd(1, 1, 1900);
  73.        
  74.        $fechaActual = explode('-', date('j-n-Y'));
  75.        $diasActual = gregoriantojd($fechaActual[1], $fechaActual[0], $fechaActual[2]);
  76.        
  77.        $diasTranscurridos = $diasActual - $diasDefault;
  78.        
  79.        echo 'Dias trancurridos de la fecha 1-1-1900 hasta la fecha actual '.$diasTranscurridos.' diasz<br />';
  80.  
  81.     }
  82.    
  83.     public function diaSemana() {
  84.         $diaSemana = gregoriantojd(1, 1, 1900);
  85.         $diaSemana = jddayofweek($diaSemana, 0);
  86.        
  87.         echo 'El dia de la fecha 1-1-1900 es '.$diaSemana;
  88.     }
  89.    
  90.     public function siguiente() {
  91.         $this->day++;
  92.     }
  93.    
  94.     public function anterior() {
  95.         $this->day--;
  96.     }
  97. }
  98.  
  99. $fecha = new Fecha();
  100. $fecha->leer(1,1,2014);
  101. $fecha->diasTranscurridos();
  102. $fecha->diaSemana();
  103. $fecha->anterior();
  104. ?>

En el metodo diasTranscurridos() tuve que hacer una conversión de gregoriano a juliano, por es menor que la fecha del timestamp.

Al igual que al metodo diaSemana().

Queria saber como plantiarian esta misma clase algunos de ustedes ya que yo recien estoy empezando y debe tener algunos errores. Tambien alas propiedades que estoy usando adentro de la clase como son $diaSemana, $diasDefault, $fechaActual, ect. Se hacen propiedades publicas?

¡Saludos!
  #2 (permalink)  
Antiguo 12/11/2015, 02:30
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Ejecicio clase Fecha

Saludo
Pues en la función diaMes, pondría por default algún mes,
y llamaría a la función de validación de fecha en el constructor (como en el requerimiento)

En cuanto a la conversión, sí es mejor, porque curiosamente haciendo esto
date('Y',mktime(0,0,0,1,1,1900));
devuelve 1970, ¿será un bug de php o falta algo más?
(Y sobra la z en la respuesta del método)

Finalmente, en las funciones de siguiente y anterior,
usaria $this->day + 1 y $this->day - 1 respectivamente.

Esto porque sí se deja como está actualmente, al llamar a siguiente(),
mostraría la misma fecha, pues se está incrementando luego de mostrar la fecha,
debería ser antes, pero al estar trabajando con el valor de $this->day directamente
al llamar a anterior() se obtendrá el valor de siguiente() por la misma razón,
se está decrementando después de mostrarse.

Esto se solucionaría haciendo las operaciones antes, pero sí por algún motivo
se llama primero a anterior() y luego a siguiente() los resultados van a cambiar
por las operaciones sobre el atributo de la clase.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #3 (permalink)  
Antiguo 12/11/2015, 11:11
Avatar de gonzaherrera77  
Fecha de Ingreso: noviembre-2015
Mensajes: 60
Antigüedad: 8 años, 6 meses
Puntos: 7
Respuesta: Ejecicio clase Fecha

Muchas gracias por su tiempo voy hacer los cambios mencionados, y las variables que estoy usando en la clase Fecha no hay ningun problema si no la declaro con el metodo private, public o protected?

¡Saludos!
  #4 (permalink)  
Antiguo 12/11/2015, 11:21
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Ejecicio clase Fecha

Saludo.
Pues las variables están declaradas como private.
Sí se hace referencia a las otras variables que están
siendo usadas como auxiliares (Por ej dayOk),
sí posteriormente se hará algo con ellas,
lo mejor sería declararlas como privadas y accederlas
por un método.

Finalmente, en la función de validarFecha se podría omitir
recibir los valores por la función, y hacer uso de los atributos de la clase,
pues tanto las variables como esta función son privadas.
(Esto haría que la función leer asignara primero los valores)
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #5 (permalink)  
Antiguo 12/11/2015, 12:21
Avatar de gonzaherrera77  
Fecha de Ingreso: noviembre-2015
Mensajes: 60
Antigüedad: 8 años, 6 meses
Puntos: 7
Respuesta: Ejecicio clase Fecha

Cita:
Saludo.
Pues las variables están declaradas como private.
Sí se hace referencia a las otras variables que están
siendo usadas como auxiliares (Por ej dayOk),
sí posteriormente se hará algo con ellas,
lo mejor sería declararlas como privadas y accederlas
por un método.

Finalmente, en la función de validarFecha se podría omitir
recibir los valores por la función, y hacer uso de los atributos de la clase,
pues tanto las variables como esta función son privadas.
(Esto haría que la función leer asignara primero los valores)
Podria ser asi? o no estoy entendiendo vien el concepto.

Código PHP:
<?php
public function leer($day$month$year) {
   
$this->day $day;
   
$this->month $month;
   
$this->year$year;

   
$this->validarFecha();
}

public function 
validarFecha() {
   if(
$this->day && $this->day <=31) {
         
$dayOk true;
   }
   else {
         
$dayOk false;
   }
   if(
$this->month && $this->month <=12) {
         
$monthOk true;
   }
   else {
         
$monthOk false;
   }
   if(
$this->year && $this->year <=12) {
         
$yearOk true;
   }
   else {
         
$yearOk false;
   }

   if(!
$dayOk, !$monthOk, !$yearOk) {
      echo 
'Fecha no valida...';

      
$this->day 1;
      
$this->month 1;
      
$this->year 1900;
   }
}
?>
¡Saludos!
  #6 (permalink)  
Antiguo 12/11/2015, 17:31
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Ejecicio clase Fecha

Saludo.
Sí, así tal cual.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #7 (permalink)  
Antiguo 12/11/2015, 17:36
Avatar de gonzaherrera77  
Fecha de Ingreso: noviembre-2015
Mensajes: 60
Antigüedad: 8 años, 6 meses
Puntos: 7
Respuesta: Ejecicio clase Fecha

Gracias por todos tus consejos!!!

¡Saludos!

Etiquetas: clase, fecha
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:00.