Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Настраиваемый ввод даты 
:(
    Опции темы
Flap
Дата 9.12.2008, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Добрый день.

Столкнулся с такой проблеммой:
В админке есть настройка "формат даты". Задается в формате РНР, например 'd.m.Y' (может быть и по другому)

Нужно сделать так, чтобы при вводе даты пользователем, дата проверялась на допустимость значений, конвертировалась в timestamp и далее запись в БД.

С помощью такого кода удается отловить только самые грубые ошибки и месяц постоянно = 1

Код

                $reg = 'd.m.Y'; //формат даты
                $value = '15.10.1990'; //это введеное пользователем значение

                $b = Zend_Date::isDate($value, $reg); //проверим дату на правильность
                if( $b === false ){//error 1
                    $success = 0;
                    $error = $this->translate->_("Date format is wrong");
                    $res = $this->translate->_("Date format is wrong");
                }else{
                    $d = new Zend_Date($value, $reg); 
                    $d = $d->__toString();

                    $res = Zend_Debug::dump($d, null, false);
                }


в $res всегда получаем '15.01.1990'
Видима я чего-то не понимаю.
Может подскажет кто, как это сделать не через Zend framework и правильно.

Т.е. по сути, нужна функция, обратная date (указал строку, указал формат строки и получил timestamp);
strtotime не подходит, поскольку там нельзя указать произвольный формат входной строки.

Спасибо.
PM MAIL   Вверх
Flap
Дата 9.12.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Единственный вариант вижу: конвертировать введеную пользователем дату в формат для strtotimе согласно настройкам и далее через strtotime получать ее timestamp. Но может есть более простой вариант?
PM MAIL   Вверх
ksnk
Дата 9.12.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



strptime, strftime ?

Впрочем, можно просто вручную перевести дату в формат strtotime, заменив точки на косые...


Это сообщение отредактировал(а) ksnk - 9.12.2008, 12:17


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Flap
Дата 9.12.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Так в том-то и дело, что неизвестно, что захочет пользователь. 
d M Y
d-m-Y
d(D) F, Y  - все это, по идее допускается.

Надо с заказчиком компропис искать  smile .
PM MAIL   Вверх
ksnk
Дата 9.12.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

preg_replace('/(\d+)\D+(\d+)\D+(\d+)/','$1/$2/$3',$v);

?



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Flap
Дата 9.12.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Это все работало, если б не это:
Цитата(Flap @  9.12.2008,  09:34 Найти цитируемый пост)
В админке есть настройка "формат даты". Задается в формате РНР, например 'd.m.Y' 


Всех вариантов не учтешь.

Как я уже говорил, спасет только функция, обратная date

как-то так:

timestamp undate($aFormat, $aStringDate) smile
PM MAIL   Вверх
bars80080
Дата 9.12.2008, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



ну, это уже походит на разделение варенья и сметаны, когда они обе банки разбились, а содержимое хорошо перемешалась

всех вариантов предугадать нельзя, поэтому лучше поставить обработку разделителей в нужный вид, затем strtotime и если дата не оказалась в нужном диапазоне, то ошибку -> неправильнный ввод даты

я вообще делаю так. если дата имеет значение только в качестве информации (скажем дата выдачи паспорта), по которой поиск никогда проводиться не будет, то даю пользователям ввести как им угодно. если нужно точное число, которое будет применяться для сортировки, то ставлю три селекта на день/месяц/год и пусть выбирают из нужных вариантов. формат обеспечен
PM MAIL WWW   Вверх
Flap
Дата 10.12.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Вообщем, сделал через Zend Framework, формат ограничил символами d, m, M, s, y.
Вроде нормально в обе стороны работает.
Спасибо всем за идеи.
PM MAIL   Вверх
Aliance
Дата 10.12.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Желательно чтобы человек, просивший совета и нашедший ответ собственными силами, поделился им с другими - вдруг кому-то пригодиться!
PM MAIL WWW ICQ Skype   Вверх
sanzend
Дата 30.12.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 30.12.2008

Репутация: нет
Всего: нет



Цитата

В админке есть настройка "формат даты". Задается в формате РНР, например 'd.m.Y' (может быть и по другому)

Нужно сделать так, чтобы при вводе даты пользователем, дата проверялась на допустимость значений, конвертировалась в timestamp и далее запись в БД.

С помощью такого кода удается отловить только самые грубые ошибки и месяц постоянно = 1


С помощью Zend это вполне реально. Zend_Date понимает константы функции date, только об этом нужно позаботится предварительно

Код

Zend_Date::setOptions(array('format_type' => 'php'));


а у вас месяц 1 потому что по дефолту для Zend_Date "m" это не месяц а минута. Смотрите http://framework.zend.com/manual/ru/zend.d....constants.list

Итого, передавайте в isDate выбранный формат, только так чтобы Zend_Date его понимал, и вы получите желаемый результат. А дату пусть вводят с помощью селектов или еще лучше JS календаря.


Это сообщение отредактировал(а) sanzend - 30.12.2008, 13:41
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.