Анализировать и создавать ISO 8601 Дата и интервалы времени, такие как PT15M в PHP

Я знаю, что это поздний ответ, и что-то уже принято, но я нашел лучшее решение для меня - не устанавливать прозрачность UIView напрямую, а вместо этого установить цвет фона на 0,0, 0,0, делая цвет полностью прозрачным.

27
задан Basil Bourque 23 May 2018 в 20:12
поделиться

2 ответа

Имейте в виду, что преобразование длительностей, содержащих дни, месяцы и / или годы, в длительность, например секунды, не может быть выполнено точно без знания фактической начальной даты / времени.

Например,

1 SEP 2010:  +P1M2D means +2764800 seconds
1 OCT 2010:  +P1M2D means +2851200 seconds

Это потому, что в сентябре 30 дней, а в октябре 31 день. Та же проблема возникает с преобразованием интервалов года из-за високосных лет и високосных секунд. Високосные годы также усложняют конвертацию Месяца - поскольку февраль в високосные годы на один день длиннее, чем в противном случае. Дни являются проблематичными в районах, где практикуется летнее время - однодневный период, происходящий во время перехода на летнее время, фактически на 1 час длиннее, чем это было бы в противном случае.

Все, что говорится - вы можете, конечно, сжать значения, содержащие только Часы, Минуты и Секунды, в значения, содержащие только Секунды. Я бы посоветовал вам создать простой парсер для выполнения работы (или, возможно, рассмотреть регулярное выражение).

Просто знайте о ловушках, описанных выше - там будут драконы. Если вы намереваетесь иметь дело с днями, месяцами и / или годами, вам нужно использовать один из встроенных механизмов, чтобы выполнить математику для вас в контексте известной даты / времени. Как уже упоминали другие: класс DateInterval в сочетании с функциями, предоставляемыми в классе DateTime, является, вероятно, наиболее интуитивным способом решения этой проблемы. Но это доступно только в PHP версии 5.3.0 или выше.

Если вам нужно работать с версией ниже v5.3.0, вы можете попытаться построить что-то вокруг этого маленького драгоценного камня:

$startDateTime = '19700101UTC';
$duration = strtotime( $startDateTime.'+1Year1Day1Second' ) - strtotime($startDateTime);
print("Duration in Seconds:  $duration");

strtotime не будет работать с форматом ISO 8601 напрямую (например, P1Y1DT1S), но формат, который он понимает (1Year1Day1Second), не слишком далек - это было бы довольно прямым преобразованием. (немного "хакерский" ... но для вас это PHP).

удачи!

7
ответ дан 28 November 2019 в 05:36
поделиться

То, что вы ищете, это DateTime :: diff

Объект DateInterval, представляющий разницу между двумя датами или FALSE при ошибке, как показано ниже:

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%d days');

Просто используйте секунды вместо дат.

Это из http://www.php.net/manual/en/datetime.diff.php

Ссылку на DateInterval см. В http: // www.php.net/manual/en/class.dateinterval.php

0
ответ дан 28 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: