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

Задача
Необходимо извлечь из строки дату или время в формате, пригодном для вычислений. Например, конвертировать представление даты, такое как «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[1] до $date_parts[6].


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

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

Можно также использовать функцию split();
$ar = split('[- :]',$date);
print_r($ar);
Array
(
[0] => 1974
[1] => 12
[2] => 03
[3] => 05
[4] => 12
[5] => 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() очевидно имеет намного большую гибкость.

Оцените статью: (0 голосов)
0 5 0

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

Вернуться в раздел: PHP / 3. Дата и время