dimarina.ru

html, css и javascript1   Разное1   Рецепты программирования на PHP или практические советы по программированию7   Управление проектом1  

 

Рецепты программирования на 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));

Комментарии:

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

08.10.2011 → Владимир написал:
Благодарю за статью! Только вот эти руки очень жутко смотрится на тёмном фоне, меня аж передёрнуло, когда увидел)

Написать комментарий





Включите отображение картинок в браузере
Число на картинке: