Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Leguim en 9 Febrero 2020, 04:20 am



Título: [Resuelto] ¿Qué operación matematica puedo hacer para arreglar esto?
Publicado por: Leguim en 9 Febrero 2020, 04:20 am
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
  1.                $secondsInAMinute = 60;
  2. $secondsInAnHour = 60 * $secondsInAMinute;
  3. $secondsInADay = 24 * $secondsInAnHour;
  4. $secondsInAMonth = 30 * $secondsInADay;
  5. $secondsInAYear = 12 * $secondsInAMonth;
  6.  

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.


Título: Re: ¿Qué operación matematica puedo hacer para arreglar esto?
Publicado por: engel lex en 9 Febrero 2020, 04:46 am
puedes simplemente hacer esto

Código
  1. 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


Título: Re: ¿Qué operación matematica puedo hacer para arreglar esto?
Publicado por: MinusFour en 9 Febrero 2020, 14:03 pm
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
  1. <?php
  2. $fecha = '2001-02-01';
  3. $segundos = 3600*24*30;
  4. $d1 = new DateTime($fecha);
  5. $d2 = new DateTime($fecha);
  6. $interval = new DateInterval("PT{$segundos}S");
  7. $d1->add($interval);
  8. print_r($interval);
  9. echo $d2->format('Y-m-d H:i:s') . "\n";
  10. echo $d1->format('Y-m-d H:i:s') . "\n";
  11.  
  12. $interval2 = $d2->diff($d1);
  13.  
  14. print_r($interval2);

Código:
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
)


Título: Re: ¿Qué operación matematica puedo hacer para arreglar esto?
Publicado por: EdePC en 9 Febrero 2020, 15:46 pm
- 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

(https://i.ibb.co/sFPK1SW/google-day-to-month.png)

Código
  1. <?php
  2.  
  3.  $total_seconds = 100;
  4.  
  5.  $secondsInAMinute = 60;
  6.  $secondsInAnHour  = 60     * $secondsInAMinute;
  7.  $secondsInADay    = 24     * $secondsInAnHour;
  8.  $secondsInAMonth  = 30.417 * $secondsInADay;
  9.  $secondsInAYear   = 12     * $secondsInAMonth;
  10.  
  11.  $years     = $total_seconds / $secondsInAYear;
  12.  $r_years   = $total_seconds % $secondsInAYear;
  13.  
  14.  $months    = $r_years / $secondsInAMonth;
  15.  $r_months  = $r_years % $secondsInAMonth;
  16.  
  17.  $days      = $r_months / $secondsInADay;
  18.  $r_days    = $r_months % $secondsInADay;
  19.  
  20.  $hours     = $r_days / $secondsInAnHour;
  21.  $r_hours   = $r_days % $secondsInAnHour;
  22.  
  23.  $minutes   = $r_hours / $secondsInAMinute;
  24.  $r_minutes = $r_hours % $secondsInAMinute;
  25.  
  26.  $seconds   = $r_minutes;
  27.  
  28.  echo "Años     : " . (int) $years   . "<br>";
  29.  echo "Meses    : " . (int) $months  . "<br>";
  30.  echo "Días     : " . (int) $days    . "<br>";
  31.  echo "Horas    : " . (int) $hours   . "<br>";
  32.  echo "Minutos  : " . (int) $minutes . "<br>";
  33.  echo "Segundos : " . (int) $seconds . "<br>";
  34. ?>

Código:
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.


Título: Re: ¿Qué operación matematica puedo hacer para arreglar esto?
Publicado por: @XSStringManolo 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
  1. <html>
  2. <script>
  3. var res=0, año = parseInt(prompt("Pon el año"));
  4.  
  5. if (año % 4 == 0) {
  6.  res=1;
  7.  /* De momento es bisiesto */
  8.  if (año % 100 == 0) {
  9.  res=0;
  10.  /* Ya no es bisiesto */
  11.    if (año % 400 == 0) {
  12.  /* A menos que se cumpla esta condición */
  13.    res=1;
  14.    }
  15.  
  16.  }
  17.  
  18. }
  19.  
  20. if (res) {
  21.  alert("El año " + año + " es bisiesto.");
  22. }
  23.  
  24. else {
  25.  alert("El año " + año + " no es bisiesto.");
  26. }
  27. </script>
  28. </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 :')


Título: Re: ¿Qué operación matematica puedo hacer para arreglar esto?
Publicado por: Leguim en 9 Febrero 2020, 18:15 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
  1. <html>
  2. <script>
  3. var res=0, año = parseInt(prompt("Pon el año"));
  4.  
  5. if (año % 4 == 0) {
  6.  res=1;
  7.  /* De momento es bisiesto */
  8.  if (año % 100 == 0) {
  9.  res=0;
  10.  /* Ya no es bisiesto */
  11.    if (año % 400 == 0) {
  12.  /* A menos que se cumpla esta condición */
  13.    res=1;
  14.    }
  15.  
  16.  }
  17.  
  18. }
  19.  
  20. if (res) {
  21.  alert("El año " + año + " es bisiesto.");
  22. }
  23.  
  24. else {
  25.  alert("El año " + año + " no es bisiesto.");
  26. }
  27. </script>
  28. </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...