Saltar al contenido

como convertir string duración al formato de duración ISO 8601? (por ejemplo, “30 minutos” a “PT30M”)

Hola usuario de nuestro sitio web, tenemos la solución a tu interrogante, deslízate y la hallarás a continuación.

Solución:

Primero lo convertiría en un número, luego trabajaría con eso.

Primer uso strtotime():

$time = strtotime("1 hour 30 minutes", 0);

Luego puede analizarlo por duración y generarlo en PnYnMnDTnHnMnS formato. Usaría el siguiente método (inspirado en http://csl.sublevel3.org/php-secs-to-human-text/):

function time_to_iso8601_duration($time) 
    $units = array(
        "Y" => 365*24*3600,
        "D" =>     24*3600,
        "H" =>        3600,
        "M" =>          60,
        "S" =>           1,
    );

    $str = "P";
    $istime = false;

    foreach ($units as $unitName => &$unit) 
        $quot  = intval($time / $unit);
        $time -= $quot * $unit;
        $unit  = $quot;
        if ($unit > 0) 
            if (!$istime && in_array($unitName, array("H", "M", "S")))  // There may be a better way to do this
                $str .= "T";
                $istime = true;
            
            $str .= strval($unit) . $unitName;
        
    

    return $str;

El resultado: http://codepad.org/1fHNlB6e

Aquí hay una versión simplificada de Eric time_to_iso8601_duration() función. No pierde precisión (aproximación de 365 días a un año) y es unas 5 veces más rápida. La salida es menos bonita pero sigue siendo compatible con ISO 8601 según esta página.

function iso8601_duration($seconds)

    $days = floor($seconds / 86400);
    $seconds = $seconds % 86400;

    $hours = floor($seconds / 3600);
    $seconds = $seconds % 3600;

    $minutes = floor($seconds / 60);
    $seconds = $seconds % 60;

    return sprintf('P%dDT%dH%dM%dS', $days, $hours, $minutes, $seconds);

Otro enfoque es escribir una función basada en el objeto DateInterval. El formato de duración ISO 8601 está bien descrito.

La ventaja de este enfoque es que solo genera las representaciones relevantes (presentes) y admite duraciones vacías (comúnmente denotadas como 'PT0S' o 'P0D').

function dateIntervalToISO860Duration(DateInterval $d) 

Un ejemplo:

echo dateIntervalToISO860Duration(
    date_diff(
        new DateTime('2017-01-25 18:30:22'), 
        new DateTime('2019-03-11 07:12:17')
    )
);

Producción: P2Y1M13DT12H41M55S

Tienes la posibilidad dar recomendación a esta noticia si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *