Выделение дат и времен из строк

Задача
Необходимо извлечь из строки дату или время в формате, пригодном для вычислений. Например, конвертировать представление даты, такое как «last Thursday» (последний четверг) в метку времени UNIX.

Решение
Проще всего анализировать строки даты или времени с помощью функции strtotime(), которая превращает множество понятных человеку строк даты и времени в метку времени UNIX:

$a = strtotime('march 10'); // по умолчанию в текущий год


Обсуждение
Грамматика функции strtotime() и сложна и обширна, поэтому лучший способ освоиться с ней состоит в том, чтобы попробовать множество различных представлений времени. Те, кому интересны ее секреты, могут обратититься к файлу ext/standard/parsedate.y из дистрибутива PHP. Функция strtotime() понимает слова, описывающие текущее время:

$a = strtotime('now');
print strftime('%c',$a);
$a = strtotime('today');
print strftime('%c',$a);
Mon Aug 12 20:35:10 2002
Mon Aug 12 20:35:10 2002


Она понимает различные способы представления времени и даты:
$a = strtotime('5/12/1994');
print strftime('%c',$a);
$a = strtotime('12 may 1994');
print strftime('%c',$a);
Thu May 12 00:00:00 1994
Thu May 12 00:00:00 1994


Она понимает относительные время и дату:
$a = strtotime('last thursday'); // 12 августа 2002 года
print strftime('%c',$a);
$a = strtotime('2001-07-12 2pm + 1 month');
print strftime('%c',$a);
Thu Aug 8 00:00:00 2002
Mon Aug 12 14:00:00 2002


Она понимает часовые пояса. Когда следующий код запускается на компьтере, находящемся в зоне восточного поясного летнего времени (Eastern Daylight Time, EDT), он выводит то же самое время:

$a = strtotime('2002-07-12 2pm edt + 1 month');
print strftime('%c',$a);
Mon Aug 12 14:00:00 2002


Однако если код, приведенный ниже, запустить на компьютере, находящемся в поясе EDT, то он выведет время в часовом поясе EDT (16:00), когда в зоне горного летнего времени (Mountain Daylight Time, MDT), расположенной на 2 часа ближе к Гринвичу, чем пояс EDT, наступает два часа пополудни (14:00):

$a = strtotime('2002-07-12 2pm mdt + 1 month');
print strftime('%c',$a);
Mon Aug 12 16:00:00 2002


Если дата и время, которые требуется выделить из строки, представлены в известном заранее формате, то можно не вызывать функцию strtotime(), а сконструировать регулярное выражение, выделяющее необходимые части даты и времени. Ниже показано, как разобрать даты формата «YYYY-MM-DD HH:MM:SS», такие как поле DATETIME в MySQL:

$date = '1974-12-03 05:12:56';
preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
',$date,$date_parts);


Этот фрагмент помещает год, месяц, день, час, минуту и секунду в переменные от $date_parts до $date_parts. (Функция preg_match() помещает все выделенное выражение в переменную $date_parts[0].) Регулярные выражения позволяют извлечь дату и время из большей строки, которая может также содержать и другую информацию (из ввода пользователя или из файла), но если известно расположение даты в разбираемой строке, то вызов функции substr() может даже ускорить разбор строки:

$date_parts[0] = substr($date,0,4);
$date_parts = substr($date,5,2);
$date_parts = substr($date,8,2);
$date_parts = substr($date,11,2);
$date_parts = substr($date,14,2);
$date_parts = substr($date,17,2);


Можно также использовать функцию split();
$ar = split('[- :]',$date);
print_r($ar);
Array
(
[0] => 1974
=> 12
=> 03
=> 05
=> 12
=> 56
)


Будьте осторожны: PHP выполняет преобразование между числами и строками без какого-либо предупреждения, но числа, начинающиеся с 0, считаются восьмеричными (по основанию 8). Поэтому 03 и 05 – это 3 и 5; но 08 и 09 – это не 8 и 9. Функции preg_match() и strtotime() имеют одинаковую эффективность при анализе формата даты, такого как «YYYY-MM-DD HH:MM:SS», но функция ereg() работает почти в четыре раза медленнее, чем другие. Для отделения части строки даты функция preg_match() наиболее удобна, но функция strtotime() очевидно имеет намного большую гибкость.
Теги:
strtotime, parts, времени, print, strftime, время, substr, 2002 , строки, match, понимает, функции, функция, month, может, летнего, Функция, Daylight, также, split, 1994 , находящемся, помещает, множество, части, поясе, функцию, извлечь, метку, формате, формата, файла, вызывать, пользователя, ввода
Добавлено: 21 Июля 2018 06:58:37 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...