calcular edad en utils.php

En estos dias me ocurrio que necesitaba el codigo calcular la edad apartir de la fecha de nacimiento y cualquier fecha, desarrolle el codigo y me di cuenta que seria util integrar esto al framework.

Seria recomendable adaptarla con el formato de fecha que se utiliza en core.ini para la bd

Pero basicamente el utils es el siguiente:
function age($fecha_nac, $fecha=false){
	$f = explode('-', $fecha_nac);
	
	if(!$fecha){
		$g = explode('-',date('Y-m-d'));
	} else {
		$g = explode('-',$fecha);
	}
	
	$edad = $g[0] - $f[0];
	
	if($edad){
		if($g[1] < $f[1]){
			$edad--;
		} else if($g[1] == $f[1]){
			if($g[2] < $f[2]){
				$edad--;
			}
		}
	}
	
	return $edad;
}

Que les parece la idea?

Saludos.

Comentarios

  • edited 10:29
    En estos dias me ocurrio que necesitaba el codigo calcular la edad apartir de la fecha de nacimiento y cualquier fecha, desarrolle el codigo y me di cuenta que seria util integrar esto al framework.

    Seria recomendable adaptarla con el formato de fecha que se utiliza en core.ini para la bd

    Pero basicamente el utils es el siguiente:
    function age($fecha_nac, $fecha=false){
    	$f = explode('-', $fecha_nac);
    	
    	if(!$fecha){
    		$g = explode('-',date('Y-m-d'));
    	} else {
    		$g = explode('-',$fecha);
    	}
    	
    	$edad = $g[0] - $f[0];
    	
    	if($edad){
    		if($g[1] < $f[1]){
    			$edad--;
    		} else if($g[1] == $f[1]){
    			if($g[2] < $f[2]){
    				$edad--;
    			}
    		}
    	}
    	
    	return $edad;
    }
    

    Que les parece la idea?

    Saludos.

    Me parece muy buena idea, ya que soluciona un requerimiento bastante frecuente.
  • edited 10:29
    Me parace bien la funcion, pero creo que no se deberia generalizar en una funcion que se base en fechas tipo 00-00-0000 ( 00/00/0000 o 00/00/00), sino que se base en varios formatos o que exista una funcion adicional para normalizar dichas fechas.
  • edited 10:29
    Tienes razon, voy a ver cuanta disponibilidad otorga el tipo Date (nativo del lenguaje) para esto.

    Saludos.
  • edited 10:29
    Me parace bien la funcion, pero creo que no se deberia generalizar en una funcion que se base en fechas tipo 00-00-0000 ( 00/00/0000 o 00/00/00), sino que se base en varios formatos o que exista una funcion adicional para normalizar dichas fechas.

    Que opinan de los parámetros con nombre para ese propósito?,
    seria algo así:

    // todas estas invocaciones arrojarían el mismo resultado
    age("date: 24", "month: 7", "year: 1983");
    
    age("year: 1983", "date: 24", "month: 7");
    
    age("month: 7", "date: 24", "year: 1983");
    
  • edited 10:29
    Casualmente habia pensado en una implementacion similar, en conjunto a la manera como lo planteas y esto es lo que tenemos:
    function age(){
    	$params = get_params(func_get_args());
    	$time_nac = mktime(0, 0, 0, $params['month'], $params['day'], $params['year']);
    	
    	if(func_num_args()==3){
    		$time = time();
    	} elseif(func_num_args()==6) {
    		$time = mktime(0, 0, 0, $params['act_month'], $params['act_day'], $params['act_year']);
    	}
       
    	$edad = idate('Y' ,$time) - idate('Y' ,$time_nac);
       
    	if($edad>0){
    		if(idate('m' ,$time) < idate('m' ,$time_nac)){
    			$edad--;
    		} else if(idate('m' ,$time) == idate('m' ,$time_nac)){
    			if(idate('d' ,$time) < idate('d' ,$time_nac)){
    				$edad--;
    			}
    		}
    	} elseif($edad<0) {
    		$edad = 0;
    	}
       
    	return $edad;
    } 
    

    Y se utilizaria a traves de parametros con nombre
    age('year: 1985', 'month: 5', 'day: 9')
    age('year: 1985', 'month: 5', 'day: 9', 'act_year: 1990', 'act_month: 5', 'act_day: 9')
    

    Que les parece?

    Saludos.
  • edited 10:29
    Creo que también seria interesante añadir el condicional siguiente si se pasa una fecha global.

    <!-- m --><a class="postlink" href="http://es.php.net/manual/es/function.ereg.php">http://es.php.net/manual/es/function.ereg.php</a><!-- m -->

    Yo por ejemplo la uso para normalizar fechas
    function format_date&#40;$fecha&#41; &#123;
        if &#40;ereg&#40;&quot;&#40;&#91;0-9&#93;&#123;1,2&#125;&#41;/&#40;&#91;0-9&#93;&#123;1,2&#125;&#41;/&#40;&#91;0-9&#93;&#123;2,4&#125;&#41;&quot;, $fecha, $mifecha&#41; || ereg&#40;&quot;&#40;&#91;0-9&#93;&#123;1,2&#125;&#41;-&#40;&#91;0-9&#93;&#123;1,2&#125;&#41;-&#40;&#91;0-9&#93;&#123;2,4&#125;&#41;&quot;, $fecha, $mifecha&#41;&#41; &#123;
    		$day	= $mifecha&#91;1&#93;;
    		$month	= $mifecha&#91;2&#93;;
    		$year	= $mifecha&#91;3&#93;;
    		if &#40;!checkdate&#40;$month,$day,$year&#41;&#41; &#123;
    			$lafecha = date&#40;'Y-m-d'&#41;;
    		&#125; else &#123;
    			$lafecha = $year&#46;&quot;-&quot;&#46;$month&#46;&quot;-&quot;&#46;$day;
    		&#125;
        &#125; else &#123;
    		$lafecha = date&#40;'Y-m-d'&#41;;
        &#125;
        return $lafecha;
    &#125;
    
  • Aqui presento el util para calcular edad

    Se utiliza de la siguiente manera:
    - Se pueden pasar parametros con nombre "year", "month", "day", para la fecha de nacimiento.

    - Por defecto se calcula la edad apartir de la fecha actual (día de hoy), en caso de que se especifique una fecha diferente, se realiza a través de los parametros con nombre "today_year", "today_month", "today_day".

    -Se permite el uso de fechas preformateadas "Y-m-d" o "Y/m/d" a través de los parametros con nombre "birthdate" y "today" para la fecha de nacimiento y la fecha de hoy respectivamente.

    Ejemplos:
    age&#40;'year&#58; 1985', 'month&#58; 5', 'day&#58; 9'&#41;;   // y todas sus combinaciones claro esta
    age&#40;'year&#58; 1985', 'month&#58; 5', 'day&#58; 9', 'today_year&#58; 2005', 'today_month&#58; 10', 'today_day&#58; 1'&#41;;
    age&#40;'year&#58; 1985', 'month&#58; 5', 'day&#58; 9', 'today&#58; 2005-10-01'&#41;;
    age&#40;'year&#58; 1985', 'month&#58; 5', 'day&#58; 9', 'today&#58; 2005/10/01'&#41;;
    age&#40;'birthdate&#58; 1985-05-09', 'today_year&#58; 2005', 'today_month&#58; 10', 'today_day&#58; 1'&#41;;
    age&#40;'birthdate&#58; 1985/05/09', 'today_year&#58; 2005', 'today_month&#58; 10', 'today_day&#58; 1'&#41;;
    age&#40;'birthdate&#58; 1985-05-09', 'today&#58; 2005-10-01'&#41;;
    age&#40;'birthdate&#58; 1985/05/09', 'today&#58; 2005-10-01'&#41;;
    age&#40;'birthdate&#58; 1985-05-09', 'today&#58; 2005/10/01'&#41;;
    age&#40;'birthdate&#58; 1985/05/09', 'today&#58; 2005/10/01'&#41;;
    


    Este es el utils para calcular la edad:
    function age&#40;&#41;&#123;
    	$params = get_params&#40;func_get_args&#40;&#41;&#41;;
    	$error = false;
    
    	if&#40;isset&#40;$params&#91;'month'&#93;, $params&#91;'day'&#93;, $params&#91;'year'&#93;&#41;&#41;&#123;
    		$time_nac = mktime&#40;0, 0, 0, $params&#91;'month'&#93;, $params&#91;'day'&#93;, $params&#91;'year'&#93;&#41;;	
    	&#125; elseif&#40;isset&#40;$params&#91;'birthdate'&#93;&#41;&#41; &#123;
    		if &#40;ereg&#40; '^&#40;&#91;0-9&#93;&#123;1,4&#125;&#41;&#91;-/&#93;&#40;&#91;0-9&#93;&#123;1,2&#125;&#41;&#91;-/&#93;&#40;&#91;0-9&#93;&#123;1,2&#125;&#41;$', $params&#91;'birthdate'&#93;, $date&#41;&#41; &#123;
    			$time_nac = mktime&#40;0, 0, 0, $date&#91;2&#93;, $date&#91;3&#93;, $date&#91;1&#93;&#41;;
    		&#125; else &#123;
    			$error = true;
    		&#125;
    	&#125; else &#123;
    		$time_nac = time&#40;&#41;;
    	&#125;
    	
    	if&#40;isset&#40;$params&#91;'today_month'&#93;, $params&#91;'today_day'&#93;, $params&#91;'today_year'&#93;&#41;&#41;&#123;
    		$time = mktime&#40;0, 0, 0, $params&#91;'today_month'&#93;, $params&#91;'today_day'&#93;, $params&#91;'today_year'&#93;&#41;;
    	&#125; elseif&#40;isset&#40;$params&#91;'today'&#93;&#41;&#41; &#123;
    		if &#40;ereg&#40; '^&#40;&#91;0-9&#93;&#123;1,4&#125;&#41;&#91;-/&#93;&#40;&#91;0-9&#93;&#123;1,2&#125;&#41;&#91;-/&#93;&#40;&#91;0-9&#93;&#123;1,2&#125;&#41;$', $params&#91;'today'&#93;, $date&#41;&#41; &#123;
    			$time = mktime&#40;0, 0, 0, $date&#91;2&#93;, $date&#91;3&#93;, $date&#91;1&#93;&#41;;
    		&#125; else &#123;
    			$error = true;
    		&#125;
    	&#125; else &#123;
    		$time = time&#40;&#41;;
    	&#125;
     
    	if&#40;!$error&#41;&#123;
    		$edad = idate&#40;'Y' ,$time&#41; - idate&#40;'Y' ,$time_nac&#41;;
    	&#125; else &#123;
    		$edad = 0;
    	&#125;
    
    	if&#40;$edad&gt;0&#41;&#123;
    		if&#40;idate&#40;'m' ,$time&#41; &lt; idate&#40;'m' ,$time_nac&#41;&#41;&#123;
    			$edad--;
    		&#125; else if&#40;idate&#40;'m' ,$time&#41; == idate&#40;'m' ,$time_nac&#41;&#41;&#123;
    			if&#40;idate&#40;'d' ,$time&#41; &lt; idate&#40;'d' ,$time_nac&#41;&#41;&#123;
    				$edad--;
    			&#125;
    		&#125;
    	&#125; elseif&#40;$edad&lt;0&#41; &#123;
    		$edad = 0;
    	&#125;
    
    	return $edad;
    &#125; 
    

    Pienso que se puede agregar un parametro para forzar un orden de fecha preformateada al estilo del nuevo date_field_tag, asimismo que se pueda cargar el formato que determine el orden apartir de core.ini, pero son necesarias sus opiniones, para ver si asi como esta es suficiente o se agrega las flexibilidades antes mencionadas.

    Que les parece?

    Saludos.
  • Me gusta puede ser muy útil...!
  • edited 10:29
    Perfecto, una cosa más para Kumbia...XD
  • Por lo que veo, la comunidad lo aprueba <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> , ahora tal como les dije, les parece que deba extenderlo aun mas, dando soporte para fechas en distintos formatos Y-m-d, d-m-Y, m-d-Y, Y-d-m, a través de un parametro "date_format".

    Y asi mismo, cargar el formato de la fecha en el core.ini y tomar a este formato de fecha por defecto?

    Espero sus respuestas.

    Saludos
  • Por lo que veo, la comunidad lo aprueba <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> , ahora tal como les dije, les parece que deba extenderlo aun mas, dando soporte para fechas en distintos formatos Y-m-d, d-m-Y, m-d-Y, Y-d-m, a través de un parametro "date_format".

    Y asi mismo, cargar el formato de la fecha en el core.ini y tomar a este formato de fecha por defecto?

    Espero sus respuestas.

    Saludos

    A mi me gusta y me parece perfecto!
  • Muy bien helper agregemoslo al SVn

    Gracia emilio
Sign In or Register to comment.