[Resuelto] ¿Qué operación matematica puedo hacer para arreglar esto?

Iniciado por Leguim, 9 Febrero 2020, 04:20 AM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Estuve prácticamente casi todo el día creando un script que me permitiera, a partir de segundos obtener, años, meses, días, horas, minutos y lógicamente los segundos... el código de base lo conseguí en internet pero lo mejore bastante.

Lo que me devolvería, a partir de '100 segundos' => '1 minuto 40 segundos'
a partir de '1500000 segundos' => '50 años 9 meses 13 días 18 horas 34 minutos 40 segundos"

El problema que tengo es que en una parte del script:
Código (php) [Seleccionar]

               $secondsInAMinute = 60;
$secondsInAnHour = 60 * $secondsInAMinute;
$secondsInADay = 24 * $secondsInAnHour;
$secondsInAMonth = 30 * $secondsInADay;
$secondsInAYear = 12 * $secondsInAMonth;


Obtengo la cantidad total de segundos por minuto, por hora, por día, por mes y por año pero existe un problema y es que los segundos por mes que es 30 * $secondsInADay el 30 serían los días pero como sabemos no todos los meses tienen 30 días... es más hasta depende de si es un año bisiesto de que si febrero traiga 28 o 29 días...

No puedo encontrar una solución o si existe una operación matematica para solventar esto, entiendo que se puede saber si un año es bisiesto con php pero eso todavía no me alcanza para poder llegar a una solución...

Mod: Temas sobre PHP van al subforo de PHP.

engel lex

#1
puedes simplemente hacer esto

Código (php) [Seleccionar]
echo date('y-m-d h:i:s',$segundos);

y restar 1970 al año, 1 al mes y 1 al dia... tiene cierto rango de error pero es de 1 dia cada 4 años...

tambien puedes usar mysql que en general es bastante optimo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MinusFour

Lo que tu estás considerando tiene poco que ver con operaciones matemáticas. Realmente no necesitas nada fuera de aritmética básica. El problema que tienes es que necesitas contar los días relativos a una fecha.

No estoy seguro si hay una función así exactamente en PHP pero podrías hacer esto:

Código (php) [Seleccionar]

<?php
$fecha 
'2001-02-01';
$segundos 3600*24*30;
$d1 = new DateTime($fecha);
$d2 = new DateTime($fecha);
$interval = new DateInterval("PT{$segundos}S");
$d1->add($interval);
print_r($interval);
echo 
$d2->format('Y-m-d H:i:s') . "\n";
echo 
$d1->format('Y-m-d H:i:s') . "\n";

$interval2 $d2->diff($d1);

print_r($interval2);



DateInterval Object
(
    [y] => 0
    [m] => 0
    [d] => 0
    [h] => 0
    [i] => 0
    [s] => 2592000
    [invert] => 0
    [days] => 0
)
2001-02-01 00:00:00
2001-03-03 00:00:00
DateInterval Object
(
    [y] => 0
    [m] => 1
    [d] => 2
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 30
)

EdePC

- Puedes ver los factores de conversión que utiliza Google, supongo que son algo más precisos, ya que revisar las reglas de fecha para los meses y años puede ser muy laborioso (bisiestos, que meses deben tener 30 o 31 días, etc):
https://www.google.com/search?q=conversor+de+unidades



Código (php-brief) [Seleccionar]
<?php

  $total_seconds 
100;

  
$secondsInAMinute 60;
  
$secondsInAnHour  60     $secondsInAMinute;
  
$secondsInADay    24     $secondsInAnHour;
  
$secondsInAMonth  30.417 $secondsInADay;
  
$secondsInAYear   12     $secondsInAMonth;

  
$years     $total_seconds $secondsInAYear;
  
$r_years   $total_seconds $secondsInAYear;
  
  
$months    $r_years $secondsInAMonth;
  
$r_months  $r_years $secondsInAMonth;

  
$days      $r_months $secondsInADay;
  
$r_days    $r_months $secondsInADay;

  
$hours     $r_days $secondsInAnHour;
  
$r_hours   $r_days $secondsInAnHour;

  
$minutes   $r_hours $secondsInAMinute;
  
$r_minutes $r_hours $secondsInAMinute;

  
$seconds   $r_minutes;

  echo 
"Años     : " . (int) $years   "<br>";
  echo 
"Meses    : " . (int) $months  "<br>";
  echo 
"Días     : " . (int) $days    "<br>";
  echo 
"Horas    : " . (int) $hours   "<br>";
  echo 
"Minutos  : " . (int) $minutes "<br>";
  echo 
"Segundos : " . (int) $seconds "<br>";
?>


Años     : 0
Meses    : 0
Días     : 0
Horas    : 0
Minutos  : 1
Segundos : 40


- Aunque puede resultar más simple jugar con los DataInterval de PHP como comenta MinusFour.

@XSStringManolo

Pides tareas que por el tiempo que llevas programando deberías resolver en 10 segundos. Intenta romperte un poco la cabeza.

Como hice para resolverlo. Busqué: Como calcular el año bisiesto. Implementé las condiciones de la forma más sencilla del primer resultado de google, ni la página web abrí. Probé varios años bisiestos y años no bisiestos para ver que todo funciona.

Código (javascript) [Seleccionar]
<html>
<script>
var res=0, año = parseInt(prompt("Pon el año"));

if (año % 4 == 0) {
  res=1;
  /* De momento es bisiesto */
  if (año % 100 == 0) {
  res=0;
  /* Ya no es bisiesto */
    if (año % 400 == 0) {
  /* A menos que se cumpla esta condición */
    res=1;
    }
   
  }

}

if (res) {
  alert("El año " + año + " es bisiesto.");
}

else {
  alert("El año " + año + " no es bisiesto.");
}
</script>
</html>


Como siempre te complicas la vida de una forma que no tiene ni medio sentido. Si quieres saber la fecha, se la pregutas a tu sistema y la guardas. Se la preguntas a un servicio online. Se la preguntas a varios clientes y la corroboras o se la pregutas a un señor en la calle... Pero rescribir la rueda una y otra ves para tareas tan triviales solo te lleva a meter bugs y bugs y más bugs. Solo falta que se la pidas a un cliente y te dumpe la base de datos por pensar que la hora no es parámetro peligroso :')

Leguim

#5
Cita de: @?0!,5^34 en  9 Febrero 2020, 16:07 PM
Pides tareas que por el tiempo que llevas programando deberías resolver en 10 segundos. Intenta romperte un poco la cabeza.

Como hice para resolverlo. Busqué: Como calcular el año bisiesto. Implementé las condiciones de la forma más sencilla del primer resultado de google, ni la página web abrí. Probé varios años bisiestos y años no bisiestos para ver que todo funciona.

Código (javascript) [Seleccionar]
<html>
<script>
var res=0, año = parseInt(prompt("Pon el año"));

if (año % 4 == 0) {
 res=1;
 /* De momento es bisiesto */
 if (año % 100 == 0) {
 res=0;
 /* Ya no es bisiesto */
   if (año % 400 == 0) {
 /* A menos que se cumpla esta condición */
   res=1;
   }
 
 }

}

if (res) {
 alert("El año " + año + " es bisiesto.");
}

else {
 alert("El año " + año + " no es bisiesto.");
}
</script>
</html>


Como siempre te complicas la vida de una forma que no tiene ni medio sentido. Si quieres saber la fecha, se la pregutas a tu sistema y la guardas. Se la preguntas a un servicio online. Se la preguntas a varios clientes y la corroboras o se la pregutas a un señor en la calle... Pero rescribir la rueda una y otra ves para tareas tan triviales solo te lleva a meter bugs y bugs y más bugs. Solo falta que se la pidas a un cliente y te dumpe la base de datos por pensar que la hora no es parámetro peligroso :')

Te agradezco tu ayuda, pero con todo el respeto no tenia nada que ver con el problema tu respuesta... claramente dije que ya sabia que existia una operacion para calcular el año bisiesto pero eso no era suficiente... una cosa es saber la fecha actual y otra que apartir de dos fechas obtener cuanto tiempo se lleva con el formato que mostre de x años x meses x dias x horaa x minutos x segundos.

No te creas, porque aunque tengas 80 años programando pueden haber casos en los que tareas triviales te resulten más dificiles que otras que son más complicadas o es en mi caso... pero dale tampoco pregunte cuanto es 2 + 2... saludos!


Gracias a los 4, voy a hacerlo como dijo four usando diff probe un poco y parece que funciona...