Tenga en cuenta que la conversión de duraciones que contienen días, meses y/o años de una duración igual segundos no se puede hacer con precisión sin saber una fecha/hora de inicio real.
Por ejemplo
1 SEP 2010: +P1M2D means +2764800 seconds
1 OCT 2010: +P1M2D means +2851200 seconds
Esto se debe a Septiembre ha 30 días, y octubre tiene 31 días. El mismo problema ocurre con la conversión de intervalos anuales, debido a años bisiestos y segundos intercalares. Los años bisiestos también introducen una mayor complejidad en la conversión del mes, ya que febrero es un día más largo en años bisiestos que en el resto. Los días son problemáticos en áreas donde se practica el horario de verano; un período de un día que se produce durante la transición de DST, en realidad es 1 hora más de lo que sería de otra manera.
dicho todo esto - se puede, por supuesto, comprimir los valores que contienen sólo Horas, Minutos y Segundos en valores que contienen sólo unos segundos. Sugiero que construyas un analizador simple para hacer el trabajo (o tal vez consideres una expresión regular).
Simplemente tenga en cuenta las trampas descritas anteriormente: hay dragones. Si tiene la intención de lidiar con Días, Meses y/o Años, necesita utilizar uno de los mecanismos integrados para hacer los cálculos en su caso en el contexto de una fecha/hora conocida. Como otros han mencionado: la clase DateInterval, en combinación con las funciones proporcionadas en la clase DateTime, es probablemente la forma más intuitiva de lidiar con esto. Pero eso solo está disponible en PHP versión 5.3.0 o superior.
Si usted tiene que trabajar con menos de V5.3.0, se puede tratar de construir algo en torno a esta pequeña joya:
$startDateTime = '19700101UTC';
$duration = strtotime($startDateTime.'+1Year1Day1Second') - strtotime($startDateTime);
print("Duration in Seconds: $duration");
strtotime
no funcionará con el formato ISO 8601 directamente (por ejemplo P1Y1DT1S
). , pero el formato que hace entender (1Year1Day1Second
) no está muy lejos, sería una conversión bastante directa. (un poco "hacky" ... pero eso es PHP para ti).
buena suerte!
Una precaución muy tarde ... P1MT convertir a segundos sería imposible a menos que sepa si va a convertir un mes con 28, 29, 30, o 31 días. De hecho, ni siquiera puedes convertir P1YT en 365 días sin equivocarte un año de cada cuatro. (Hay una razón por la cual los intervalos no se especifican en días o segundos en el estándar.) – Bevan
@Bevan: The Answer by Lee entra en detalles con esto. TL; DR: necesitas una fecha de inicio. – berkes
Ahh - gracias @berkes, me perdí que cuando hojeé la página (lo encontré mientras buscaba algo no relacionado). – Bevan