Выделение дат и времен из строк при помощи PHP.
Решение
Проще всего анализировать строки даты или времени с помощью функции 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
Если дата и время, которые требуется выделить из строки, представлены в известном заранее формате, то можно не вызывать функцию strto time(), а сконструировать регулярное выражение, выделяющее необходимые части даты и времени. Ниже показано, как разобрать даты формата «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() очевидно имеет намного большую гибкость.
Комментарии:
Комментариев нет
|
|
|