25 de febrero de 2010

Calcular los días entre dos fechas en Openoffice y Excel

Curiosa funciones en OpenOffice, hojas de cálculo y Excel, calcular el número de días entre dos fechas.

OJO! En OpenOffice funciona mejor que en Excel, excel calcula como si todos los meses tuvieran 30 días y no tiene en cuenta años bisientos, Openoffice sí [1 punto para el software libre]

En Openoffice, hojas de cálculo:
  1. Abrir Openoffice hojas de cálculo
  • Escribir en una celda: =DÍAS(FECHA(AÑO;MES;DÍA);FECHA(AÑO;MES;DÍA))
  • Que quedaría como: =DÍAS(FECHA(2010;2;25);FECHA(2008;8;30))
  • Le damos un enter y Openoffice nos devuelve 544; que son los días que hoy, día 25 de febrero de 2010 llevo con mi pareja :-)
En Excel:
  1. Abrir "Microsoft Excel" y seleccionar una celda.
  • Escribir en la celda: =DIAS360("Aquí la fecha incial";"Aquí la fecha final")
  • Que quedaría como: =DIAS360("30/08/2008";"25/02/2010")
  • Le damos un enter y excel nos devolvería: 535; que son unos días menos de los que llevo con mi pareja (pensará que le he sido infiel :p, gracias KAI :p)
Muy bueno para saber los días que tendrá un año; saber cuántos días llevas con tu pareja, etc...
Te amo mi amor! (No le voy a aplicar la etiqueta personal :p)
Doy gracias a KAI y JHG por aportar :-)

8 comentarios:

  1. En realidad llevas 544 días con tu novia (que mira que te lo tenga que decir yo...). Esa función no es exacta. Excel es un programa de contabilidad, y por tanto, da por sentado que todos los meses cuentan 30 días (de ahí que la función se llame dias360).

    Me he tomado la libertad de escribirte un sencillo codigo en PHP que hace como Dios manda este cálculo (con años bisiestos y todo). Haz tu el formulario HTML si lo quieres usar, que no es na.

    $fecha1=$_POST['fecha1'];
    $fecha2=$_POST['fecha2'];
    //Las fechas han de estar escritas en formato DD/MM/AAAA. Los separadores son irrelevantes.

    $dia1 = substr($fecha1, 0, 2);
    $mes1 = substr($fecha1, 3, 2);
    $anno1 = substr($fecha1, 6, 4);

    $dia2 = substr($fecha2, 0, 2);
    $mes2 = substr($fecha2, 3, 2);
    $anno2 = substr($fecha2, 6, 4);

    $timestamp1 = mktime(0,0,0,$mes1,$dia1,$anno1);
    $timestamp2 = mktime(0,0,0,$mes2,$dia2,$anno2);

    $segundos_diferencia = $timestamp1 - $timestamp2;

    $dias_diferencia = $segundos_diferencia / (60 * 60 * 24);

    $dias_diferencia = abs($dias_diferencia);

    $dias_diferencia = floor($dias_diferencia);

    echo $dias_diferencia;

    ResponderEliminar
  2. Buf.... no entiendo nada KAI.
    yo de php no se NADA, nada de nada.
    intento probar el código que me acabas de dar, intento colocar algunas fechas pero que va, nada. ni siquiera sé donde tengo que probarlo.

    supongo que hay que escribir todo entre la etiqueta body y que empieze esté entre

    ResponderEliminar
  3. El codigo en PHP obtiene el valor de las fechas enviadas por el metodo HTTP POST, separa la cadena de la fecha en subcadenas para separar dia, mes y año; despues obtiene el tiempo en segundos desde la fecha que toma el interprete de PHP como fecha de inicio hasta la fecha indicada (me acuerdo que la fecha de inicio era el 1 de enero de mil novecientos algo, pero no me acuerdo del año exacto), hace lo mismo con la segunda fecha, calcula la diferencia en segundos y pasa los segundos a dias realiza un valor absoluto por si el valor tiene signo negativo y lo redondea
    por ultimo escribe el numero de dias.

    El codigo php para probarlo solo tienes que guardarlo con extension .php y colocarlo e un servidor HTTP que tenga instalado PHP. Necesitas tambien una pagina con un formulario pero en el metodo debes indicar POST y en la accion indicar el script PHP (el archivo con extension .php). El codigo PHP cuando lo guardes debes de indicar el comienzo del script y el final, pego como quedaria el escript finalmente:


    ... (la pagina) ...
    < ?php
    $fecha1=$_POST['fecha1'];
    $fecha2=$_POST['fecha2'];
    //Las fechas han de estar escritas en formato DD/MM/AAAA. Los separadores son irrelevantes.

    $dia1 = substr($fecha1, 0, 2);
    $mes1 = substr($fecha1, 3, 2);
    $anno1 = substr($fecha1, 6, 4);

    $dia2 = substr($fecha2, 0, 2);
    $mes2 = substr($fecha2, 3, 2);
    $anno2 = substr($fecha2, 6, 4);

    $timestamp1 = mktime(0,0,0,$mes1,$dia1,$anno1);
    $timestamp2 = mktime(0,0,0,$mes2,$dia2,$anno2);

    $segundos_diferencia = $timestamp1 - $timestamp2;

    $dias_diferencia = $segundos_diferencia / (60 * 60 * 24);

    $dias_diferencia = abs($dias_diferencia);

    $dias_diferencia = floor($dias_diferencia);

    echo $dias_diferencia;
    ? >
    ... (continua la pagina) ...

    Con lo que el script de PHP escribe en el documento HTML el numero de dias



    En el codigo solo cambia los ... por la pagina y desde < ?php hasta ? > (sin el espacio entre ? y el < o >) es el script en php, se sube al servidor como cualquier documento HTML pero con extension .php para que el servidor lo pase antes por el interprete de PHP.

    ResponderEliminar
  4. Gracias chicos por aportar.
    KAI, tu script funciona de maravilla :-)

    Sin embargo, hay solución más fácil, openoffice [viva el software libre] sí te lo calcula como debe, y da el mismo resultado que el script de KAI.

    Saludos y, otra vez, gracias :-)

    ResponderEliminar
  5. Gracias Kai jaja.
    Mi vida sea cual sea el tiempo exacto que llevamos, han sido los mejores dias de mi vida y ¿sabes que? tengo pensando vivir muchiisiimooss dias mas contigo, 30-08-08-->oo TE AMOOO

    ResponderEliminar
  6. De nada, y no te preocupes, que en segundo vas a tener PHP y esto te parecerá muy sencillo.

    Por cierto, buen blog (mucho Linux, me gusta xD), al feed se va :D

    ResponderEliminar
  7. Kai,

    Tu programa en PHP es demasiado trabajo, no solo porque esta incompleto (le falta el HTML que muestra el formulario), sino también porque no aporta absolutamente nada a la función DIAS() del OpenOffice.org Calc.

    Estaba buscando una función (o serie de funciones: una para días, una para meses y una para años) que me diga el número de meses enteros transcurridos en realidad entre dos fechas particulares (por ejemplo, entre el 28-may-2009 y el 5-oct-2010 transcurrieron 1 año, 10 meses, y 9 días). Ninguna de estas funciones no me lo resuelve. Voy a tener que programarla.

    Y eso significa de vuelta al PHP... :-)

    Creo que terminaré usando el objeto DateInterval() de PHP 5.3.

    Saludos,

    ResponderEliminar
  8. También funciona sin ningún cambio en OpenOffice.

    ResponderEliminar