Рецепты программирования на PHP или практические советы по программированию → Преобразование даты в формат SQL
Сколько мучений доставляют как начинающему, так и продвинутому программисту работа с датами. То в одном формате надо дату, то в другом. А пользователь может ввести дату вообще, как ему вздумается. Просить пользователя в форме каждый раз вводить дату только определенного формата (например, ДД.ММ.ГГГГ) и выдавать ошибку каждый раз, когда он введет что-то иное, некрасиво. Пользователь не должен думать. Думать должен разработчик сайта. Чем тупее пользователь, тем сложнее программисту. Вот и в этом случае, функция которая преобразует много различных форматов дат в один, получилась не такая уж и маленькая и простенькая. Существует масса путей решения.
Итак, функция преобразует введенную пользователем дату формата ДД.ММ.ГГГГ, ДД/ММ/ГГГГ, ДД-ММ-ГГ и т.п. в дату, понятную mySQL или MS SQL.
В данном случае я написал функцию, которая распознает различные разделители дат. Для краткости кода и простоты (кому-то головной боли), я использовал несложные регулярные выражения. Они красивы и кратки. Например, точку, слеш или тире. Распознает одну цифру ввел пользователь или две. В случае невозможности конвертации даты, возвращает дырку от бублика, т.е. FALSE.
Конечно функция не идеальна, ее можно усовершенствовать до бесконечности. Например, сделать массив из разрешенных разделителей. Но для большинства случаев эта функция работоспособна.
| 1 | //преобразование даты формата ДД.ММ.ГГГГ, ДД/ММ/ГГГГ и т.п. в формат ГГГГ-ММ-ДД |
| 2 | function dt2sql($dt) { |
| 3 | //определяем какой разделитель использован в дате (любое символ, кроме цифр и пробела) |
| 4 | preg_match("/([^0-9 ])/",$dt,$m); |
| 5 | if(!isset($m[1])) return FALSE; |
| 6 | //экранируем в разделитель т.к. он может являться управляющим символом регулярных выражений |
| 7 | $s = preg_quote($m[1],"/"); |
| 8 | //разбиваем строку на день, месяц и год |
| 9 | preg_match("/([\d]{1,2})".$s."([\d]{1,2})".$s."([\d]{2,4})/",$dt,$m); |
| 10 | //выводим дату в формате mySQL |
| 11 | return isset($m[1]) ? y24($m[3])."-".a0($m[2])."-".a0($m[1]) : FALSE; |
| 12 | } |
| 13 | |
| 14 | //дополнительная функция, ставящая 0 перед цифрой |
| 15 | function a0($v) { |
| 16 | return preg_match("/^\d$/",$v) ? "0".$v : $v; |
| 17 | } |
| 18 | |
| 19 | //преобразует год 09 в 2009. В качестве параметра $c задается префикс = век+1 |
| 20 | function y24($v,$c = 20) { |
| 21 | return preg_match("/^\d{2}$/",$v) ? $c.$v : $v; |
| 22 | } |
| 23 | |
| 24 | echo dt2sql("25/10/2009")."<br />"; |
| 25 | echo dt2sql("5.10.2009")."<br />"; |
| 26 | echo dt2sql("1-8-2009")."<br />"; |
Обратное преобразование даты, полученной из MySQL в любой формат делать проще-простого, особенно, если дата хранится у вас в формате TIMESTAMP. Например, если в переменной $data содержится дата, которую мы получили из БД, то чтобы вывести ДД.ММ.ГГГГ, надо сделать так:
| 1 | echo date("Y.m.d",strtotime($date)); |
Комментарии:
08.10.2011 → Владимир написал:
Благодарю за статью! Только вот эти руки очень жутко смотрится на тёмном фоне, меня аж передёрнуло, когда увидел)

29.11.2011 → Сергей написал:
Спасибо. Помогло переворотить время в уже существующей базе.