Добавить ведущий ноль к дате

Royal Flash

-=MaestrO=-
Дата в PHP-скрипт приходит без ведущих нулей, например 2011-9-1, необходимо добавить ведущий ноль, когда это необходимо ($month,$day < 10), для дальнейшей отправки в MySQL.

Можно IF определить, когда $month,$day < 10 и добавить 0:
PHP:
$day = "0".$day;
Но когда-то видел функцию PHP, решающую эту задачу. Подскажите, плз, ее название...
 

Royal Flash

-=MaestrO=-
ferryman - премного благодарен. В описании даже есть готовый пример для моего случая:
PHP:
$isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
 

Royal Flash

-=MaestrO=-
Да, согласен, понимает, если sql_mode = ''. Но при других режимах MySQL: TRADITIONAL, STRICT_TRANS_TABLES и др, возможны ошибки... Да и вообще, данные лучше отправлять всегда в стандартизированном формате.
 

Breeze

goshogun
Команда форума
Партнер клуба
PHP:
print date("Y-m-d", strtotime("2011-9-1"));
 

Royal Flash

-=MaestrO=-
Breeze - спасибо, тоже вариант, если не смотреть в сторону стандарта даты для strtotime(). Да и есть ограничение по дате:

Для большинства систем допустимыми являются даты с 13 декабря 1901, 20:45:54 GMT по 19 января 2038, 03:14:07 GMT. (Эти даты соответствуют минимальному и максимальному значению 32-битового целого со знаком). Для Windows допустимы даты с 01-01-1970 по 19-01-2038. Не все платформы поддерживают отрицательные метки времени, поэтому даты ранее 1 января 1970 г. не поддерживаются в Windows, некоторых версиях Linux и некоторых других операционных системах.
sprintf() будет обрабатывать больший диапазон дат:

date("Y-m-d", strtotime("11-2-20")) - в результате 2011-02-20, не верно
sprintf("%04d-%02d-%02d", 11, 2, 20) -в результате 0011-02-20 верно

Также, проблема с некорректной датой, например 31 февраля:
date("Y-m-d", strtotime("1111-2-31")) в результате ПРЕОБРАЗОВАНИЕ ДАТЫ в 1111-03-03 -
sprintf("%04d-%02d-%02d", 1111, 2, 31) в результате 1111-02-31 +
То есть, проверив дату на корректность после strtotime - получим true, хотя в дату внесены изменения.
 

Breeze

goshogun
Команда форума
Партнер клуба
какое ТЗ, такое и решение.
к тому же strtotime прекрасно работает со стандартами представления дат, несмотря на ограничения.
1111-2-31 не может быть корректной датой и если это приходит, то надо не нули добавлять, а либо преобразовывать в корректную, либо отправлять лесом того, кто такое прислал.
и такое разнообразие вариантов в пределах одного проекта?
 

Royal Flash

-=MaestrO=-
к тому же strtotime прекрасно работает со стандартами представления дат, несмотря на ограничения
- действительно, работает, вопреки оф. мануалу.
1111-2-31 не может быть корректной датой
- да, я так и написал. Разница в том, что проверка на корректность даты, по идее, должна происходить после её приведения к нужному формату. А в этом случае, при использовании date("Y-m-d", strtotime("1111-2-31")) мы получим корректную, но ИЗМЕНЕННУЮ дату. И если выбирать между двумя вариантами, то sprintf() имеет больше преимуществ: больший диапазон, не изменяет некорректные даты (наприм. 31 февраля на 3 марта). Отсутствие недостатков sprintf(), в сравнении с date() явно указывает, что лучше использовать.
 

Breeze

goshogun
Команда форума
Партнер клуба
проверка на корректность даты, по идее, должна происходить после её приведения к нужному формату
зачем? с проверкой без преобразований checkdate неплохо справляется, порядок следования Ymd в любом случае известен, а далее хоть sprintf, хоть date со стрпадом, в зависимости от =)
 

Redjik

Джедай-мастер
А почему к уникс формату не привести все ... и хранить в бд именно так? а уж выводить как душе угодно, хоть с нолями хоть без =)

mktime как бе
 

Breeze

goshogun
Команда форума
Партнер клуба
А почему к уникс формату не привести все ... и хранить в бд именно так? а уж выводить как душе угодно, хоть с нолями хоть без =)

mktime как бе
в 99% случаев дату надо хранить как дату в соответствующем типе, с которым удобно работать соответствующими функциями. к тому же у юникс-формата те же ограничения, что у strtotime -- размерность int32. если ОДЗ позволяет, наздоровье.
 

Redjik

Джедай-мастер
в 99% случаев дату надо хранить как дату в соответствующем типе, с которым удобно работать соответствующими функциями. к тому же у юникс-формата те же ограничения, что у strtotime -- размерность int32. если ОДЗ позволяет, наздоровье.
ОДЗ - до 1970го чтоли? у меня нет огромного опыта работы с датами - чем плохо унифицировать все даты в бд к одному виду? неужели на хайлодах сильно сказывается конвертация unix timestamp в то, что нам нужно на странице?
 

Royal Flash

-=MaestrO=-
Иван Redjik Матвеев - уважаемый, лично я полностью согласен с Breeze - дата должна храниться в виде даты (функции MySQL обработки дат и др.). Дискуссии, на тему в каком виде хранить дату, в интернете хватает, тема данного поста - "Добавить ведущий ноль к дате".

Breeze - если вам предложат 1000$ или 1200$ за одну и ту же работу с идентичными условиями, что вы выберите? :) Это я к тому, что при остальных равных условиях диапазон обрабатываемых дат у sprintf() шире.
 
Последнее редактирование модератором:

Mips

Новичок
извините за некропост, но...
sprintf() будет обрабатывать больший диапазон дат:

date("Y-m-d", strtotime("11-2-20")) - в результате 2011-02-20, не верно
sprintf("%04d-%02d-%02d", 11, 2, 20) -в результате 0011-02-20 верно

Также, проблема с некорректной датой, например 31 февраля:
date("Y-m-d", strtotime("1111-2-31")) в результате ПРЕОБРАЗОВАНИЕ ДАТЫ в 1111-03-03 -
sprintf("%04d-%02d-%02d", 1111, 2, 31) в результате 1111-02-31 +
То есть, проверив дату на корректность после strtotime - получим true, хотя в дату внесены изменения.
проблема не в функциях, проблема в неумении читать мануал. sprintf НИКАК не связан с датами, он просто выводит форматированную строку. Какой вы зададите формат, такой он и выдаст. А на счёт функции strtotime, согласно нотации, Вам выдают ровно то, что вы просите (пятый пример региональной нотации). strtotime("1111-2-31") вообще не преобразуется, т.к. эта функция работает с датами от 1901 года.
И ещё, в описании многих функций есть примечания. Настоятельно рекомендую с ними ознакамливаться прежде, чем выносить вердикт что функция работает неправильно.

Для добавления ведущих нулей воспользуйтесь date("Y-m-d", strtotime("2011-9-1"))
Это будет работать правильно при условии что 2011-9-1 - это первое сентября, а не девятое января.
Указывайте правильную нотацию и всё будет хорошо. ;)
 

AnrDaemon

Продвинутый новичок
Лучше всё таки воспользоваться stftime и правильно выставить локаль.
 
Сверху