Необычный формат времени PHP (TZ, H, M, S) - PullRequest
0 голосов
/ 12 сентября 2018

Мне дают данные, где поля времени (продолжительности) представлены в необычном формате.Я думаю, что часовой пояс также указан, но я не уверен, почему.Примером является следующая строка:

PT3165H52M12S

Как я могу извлечь часы, минуты и секунды как целые числа в PHP?До сих пор я пытался использовать регулярные выражения, но по общему признанию потерпел неудачу.

Возможно, есть функция PHP, которая могла бы помочь с этим, о которой я не знаю?

Заранее большое спасибо!

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Формат

Вы указали не дату, а точку в формате ISO 8601.В начале вашей строки «P» означает «точка», «T» - время, т. Д.

Существует множество документов по этому поводу, например, эта статья в Википедии: https://en.wikipedia.org/wiki/ISO_8601#Durations

Разобрать этот период

Вы можете проанализировать этот период, например, создать новый DateInterval объект:

var_dump(new \DateInterval("PT3165H52M12S"))

Результатом будет:

object(DateInterval)#1 (16) { ["y"]=> int(0) ["m"]=> int(0) ["d"]=> int(0) ["h"]=> int(3165) ["i"]=> int(52) ["s"]=> int(12) ["f"]=> float(0) ["weekday"]=> int(0) ["weekday_behavior"]=> int(0) ["first_last_day_of"]=> int(0) ["invert"]=> int(0) ["days"]=> bool(false) ["special_type"]=> int(0) ["special_amount"]=> int(0) ["have_weekday_relative"]=> int(0) ["have_special_relative"]=> int(0) }

0 голосов
/ 12 сентября 2018

Во-первых, наивный подход к регулярным выражениям для этого был бы довольно тривиальным, если бы во всех примерах были разделы часа, минуты и секунды, как показано:

/PT(\d+)H(\d+)M(\d+)S/

Каждый (\d+) означает «сопоставить 1 или более цифр и записать результат в переменную для последующего использования», а все остальное просто соответствует буквенным символам.

Во-вторых, как указано в комментариях, это стандартное представление ISO 8601 временного интервала, продолжительности или периода, которое разбивается следующим образом:

  • «P» для «Период» (чтобы уточнить, что это не абсолютная дата)
  • «T» для «времени» (необходимо, потому что «M» может означать месяц или минуту, в зависимости от того, где оно появляется)
  • «3165H» для 316 часов (нет ограничений на количество часов меньше 24)
  • "52M" в течение 52 минут
  • "12S" на 12 секунд

Поскольку это стандарт, он принимается как ввод по умолчанию для DateInterval класса , поэтому вы можете просто написать:

$foo = new \DateInterval('PT3165H52M12S');

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

0 голосов
/ 12 сентября 2018

Это обозначение DateInterval.

Вы можете перевести его в DateInterval объект просто с помощью:

$i = new DateInterval('PT3165H52M12S');
print_r($i);

После этого вы можете получить прямой доступ свойства из $i, поскольку они общедоступны .

echo $i->h;  // shows you `3165` (hours)
echo $i->i;  // shows you `52` (mins)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...