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:
$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.
puedes simplemente hacer esto
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
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:
<?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
)
- 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)
<?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.
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.
<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 :')
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.
<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...